gpt4 book ai didi

c# - 将 RoutedEvent 或 RoutedCommand 冒泡到 ViewModel

转载 作者:太空狗 更新时间:2023-10-29 23:27:51 26 4
gpt4 key购买 nike

我有一组 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 来保持控制不可知。

最佳答案

您可以将 State 属性添加到 TabViewModel,并检查 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
}

在您的控件中使用双向绑定(bind)到此属性:

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

最后但并非最不重要的一点是实现转换器,该转换器将与控件所需的原始值相互转换。(在我的示例中, bool 值 <--> 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com