5

スタイルを使用してタブとしてレンダリングされ、関連するコンテンツを引き出してタブに表示する ViewModel のコレクションがあります。

public class TabViewModel : DependencyObject
{
      public object Content
      {
          get { return (object)GetValue(ContentProperty); }
          set
          {
              SetValue(ContentProperty, value);
          }
      }

}

これがTabControlです:

<TabControl 
     ItemsSource={Binding MyCollectionOfTabViewModels}" 
     ItemContainerStyle="{StaticResource TabItemStyle}" />

で、スタイルはこちら

<Style TargetType="TabItem" x:Key="TabItemStyle">
     <Setter Property="Content" Value="{Binding Content}"/>
</Style>

ユーザーコントロールのインスタンスを作成し、TabViewModel の「コンテンツ」プロパティをそれに設定して、ユーザーコントロールが TabItem のコンテンツ領域に表示されるようにします。

MyCollectionOfViewModels.Add(new TabViewModel() 
{ 
     Content = new MyUserControl();
});

私の質問は、TabViewModel の Content プロパティに追加された MyUserControl (またはそのサブ コントロール) を許可して、TabViewModel が処理するイベントを発生させたいということです。

誰も私がそれを行う方法を知っていますか?

RoutedEvents と RoutedCommands を使用して実験しましたが、100% 動作し、MVVM と互換性を持たせることはできませんでした。これは RoutedEvent または RoutedCommand で実行できると本当に思いますが、これを機能させることができないようです。

注: 関連する Prism 固有のコードの一部を削除しましたが、なぜそんなにばかげたことをするのか疑問に思っている方のために説明すると、それは Prism の RegionManager を使用して制御にとらわれないようにしようとしているためです。

4

3 に答える 3

2

TabViewModelにStateプロパティを追加し、DependencyPropertyChangedイベントを確認できます。

したがって、次の列挙型を想像してください。

public enum TabViewModelState
{
    True,
    False,
    FileNotFound
}

次に、この列挙型のTabViewModelにStateプロパティを追加します。

public static readonly DependencyProperty StateProperty =
    DependencyProperty.Register("State", typeof(TabViewModelState), typeof(TabViewModel), new PropertyMetadata(OnStateChanged));

private static void OnStateChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    TabViewModel viewModel= (TabViewModel)obj;

    //Do stuff with your viewModel
}

コントロールでこのプロパティへの双方向バインディングを使用します。

<CheckBox Checked="{Binding Path=State, Converter={StaticResource StateToBooleanConverter}, Mode=TwoWay}" />

最後になりましたが、コントロールに必要な元の値との間で変換するコンバーターを実装します。(私の例ではブール値<-> TabViewModelState):

public class StateToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        TabViewModelState state = (TabViewModelState) value;
        return state == TabViewModelState.True;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool result = (bool) value;
        return result ? TabViewModelState.True : TabViewModelState.False;
    }
}

これで、UIによって管理され、応答する必要があるときに変更されたイベントをスローするStateプロパティができました。

お役に立てれば!

于 2009-08-17T08:39:33.330 に答える
1

ViewModelコマンドをGUIイベントにアタッチできるMarlonGrechのAttachedCommandBehaviorを確認する必要があります。

于 2009-08-17T08:17:50.893 に答える
1

ViewModel にコマンドを配置し、UserControl からそれにバインドするだけでも、とにかく起動します。バブルする必要はありません。UserControl はコマンドを見つけて使用するだけです。

ViewModel にデリゲート コマンド 'GoCommand' がある場合、UserControls ボタン バインディングは次のようになります。

<Button Command="{Binding GoCommand}" >Go</Button>

UserControl がコマンドをバブルする必要があると考えて同じ思考プロセスを経ましたが、そうではありません。ビューモデルでコマンドが見つかると、バインディングは自分自身を接続します。

これが役に立てば幸いです。私はポイントを逃していません! ;)

于 2009-08-13T22:33:00.610 に答える