0

私はMVVMLightを使用しています。標準ビューとビューモデルを作成しました。ビューでは、ピボットを配置しました:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <controls:Pivot Title="MY APPLICATION">
        <local:FirstPivotItem />
        <local:SecondPivotItem />
    </controls:Pivot>
</Grid>

ここで、私のピボット アイテムは次のようになります。

<controls:PivotItem x:Class="Pivot.WindowsPhoneControl1"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    // standard references and settings
    d:DesignHeight="480" d:DesignWidth="480" Header="First One">

    <Grid x:Name="LayoutRoot">

    </Grid>
</controls:PivotItem>

コード ビハインドで

public partial class WindowsPhoneControl1 : PivotItem
{
    public WindowsPhoneControl1() {
        InitializeComponent();
    }
}

このピボット アイテムのビューモデルを作成し、標準ビューと同じように操作したいと考えています。私が使用します

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <mvvm:EventToCommand Command="{Binding PivotChangedCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

選択変更イベントを処理し、メッセンジャーによって適切なビューモデルに通知します。必要に応じて、ViewModelBase からではなく PivotItem から継承された Pivot Item クラスでビューモデルの可能性を使用する方法がわかりません。

4

2 に答える 2

1

個々の項目に標準の PivotItem コントロールを使用し、ユーザー コントロールを各項目内に配置します。各ユーザー コントロールは、そのビューモデルをデータ コンテキストとして持つことができます。

 <Grid x:Name="LayoutRoot"
      Background="Transparent">
    <controls:Pivot Title="MY APPLICATION">
        <controls:PivotItem Header="first">
            <local:PivotUserControl1 />
        </controls:PivotItem>

        <controls:PivotItem Header="second">
            <local:PivotUserControl2 />
        </controls:PivotItem>
    </controls:Pivot>
</Grid>
于 2012-11-14T19:27:19.913 に答える
0

ピボット アイテムがどのようなものになるかを事前に知っているか、データに基づいて動的に作成されるかによって異なります。あなたがこれまでに書いたことから判断すると、私はそれが最初のものだと思います。

私がこれまで行ってきた方法は、多数の PivotItem ビュー モデルを親ビューモデルのパブリック プロパティとして、ピボットごとに 1 つ持つことです。次に、各 PivotItem の dataContext を親ビューモデルの正しいビューモデル プロパティに設定するだけです。

このようにして、選択変更イベントなしで逃げることができる場合があります。ビュー モデルの任意のイベントを直接サブスクライブすることもできるため、すべての通信は親ビュー モデルを経由できるため、必ずしも通信用のメッセージングに煩わ​​される必要はありません。

2 番目の方法は、どのピボット アイテムを使用するかを事前に正確に把握していない場合、親ビュー モデルに PivotItemViewModels のコレクションを作成することです。ピボット アイテムごとに 1 つ、それぞれ共通の基本クラスまたはインターフェイスから継承します。そのコレクションをビューモデルの ItemSource にバインドします。

表示するコントロールを決定する必要があるため、これは少しトリッキーですが、テンプレートがリソースとして保存されている場合は、コンバーターを介してこれを行うことができます。

public class PivotItemToTemplateConverter : IValueConverter
{
    #region IValueConverter Members


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch ((int) value)
        {
            case 1:
                return Application.Current.Resources["Control1Template"];
            case 2:
                return Application.Current.Resources["Control2Template"];
            default:
                return Application.Current.Resources["Control3Template"];
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

    #endregion
}

その後、ピボット アイテムのピボット アイテム テンプレートを作成し、コンバーターを使用して、値に基づいてそのテンプレート内の正しいコントロールを取得できます。この場合、共有された基本ビューモデルに、関心のあるコントロールを効果的に識別するプロパティ ViewModelId があると想像してください。

<ContentControl 
                Content="{Binding}"
                ContentTemplate="{Binding ViewModelId,
                                          Converter={StaticResource PivotItemToTemplateConverter }}" />
于 2012-11-15T11:59:42.823 に答える