我有一个ViewModels集合,这些ViewModels使用一种样式拉出相关内容以显示在选项卡上的方式呈现为选项卡:

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的“Content”属性设置为该实例,以便该用户控件显示在TabItem的“内容”区域中。
MyCollectionOfViewModels.Add(new TabViewModel()
{
     Content = new MyUserControl();
});

我的问题是,我想允许将添加到TabViewModel的Content属性的MyUserControl(或其任何子控件)引发一个TabViewModel处理的事件。

有人知道我会怎么做吗?

我们已经尝试过使用RoutedEvents和RoutedCommands,但是还没有任何东西能够100%正常工作并与MVVM兼容。我真的认为可以通过RoutedEvent或RoutedCommand来完成此操作,但是我似乎无法使它正常工作。

注意:我已经删除了一些与Prism相关的特定代码,但是如果您想知道为什么我们做的如此愚蠢,那是因为我们试图通过使用Prism的RegionManager来保持不可知的控制力。

最佳答案

您可以将State属性添加到TabViewModel中,然后检查DependencyPropertyChanged事件。

因此,请想象以下枚举:

public enum TabViewModelState
{
    True,
    False,
    FileNotFound
}

然后将State属性添加到此枚举的TabViewModel中:
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
}

在控件中对此属性使用双向绑定(bind):
<CheckBox Checked="{Binding Path=State, Converter={StaticResource StateToBooleanConverter}, Mode=TwoWay}" />

最后但并非最不重要的一点是实现转换器,该转换器将与控件所需的原始值之间进行转换。(在我的示例中为boolean 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属性,并在需要响应时引发更改的事件。

希望这可以帮助!

关于c# - 将RoutedEvent或RoutedCommand冒泡到ViewModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1274335/

10-09 02:45