【问题标题】:WPF MVVM accessing item bound to child view in Command implementationWPF MVVM在命令实现中访问绑定到子视图的项目
【发布时间】:2011-07-14 14:34:11
【问题描述】:

您好,我实现了我在WPF MVVM Master detail view with a datagrid and a TabControlWPF MVVM Master detail view with a datagrid and a TabControl的线程中提出的问题

它是一个主细节视图,其中数据网格作为主视图,TabControl 作为子视图。网格的 SelectedItem 绑定到 TabControl 的 ItemsSource。

如何在viewmodel中写入Command中访问绑定到TabControl的Item?基本上我想在绑定集合中添加新项目(给孩子)。但是绑定的项目是数据网格的 selectedItem - 我如何找到它是哪一个。

【问题讨论】:

    标签: c# .net wpf binding


    【解决方案1】:

    了解有关您尝试使用的命令的一些详细信息会有所帮助,但您应该能够将您正在使用的任何控件上的 CommandParameter 绑定到您正在使用的相同 DataGrid.SelectedItem 属性对于 TabControl 的 ItemsSource。然后,您应该可以使用该 CommandParameter 作为命令处理程序的参数(可能看起来不同,具体取决于您使用的 ICommand 实现 - DelegateCommand、RelayCommand 等)。

    【讨论】:

    • 感谢您提出这种方法。我会试试。在委托命令实现中,我的泛型类型应该是绑定到 DataGrid 的对象吗?
    • 通常它应该是您期望的 CommandParameter 的类型,但由于 CommandParameter 属性本身是对象类型,您也可以将其保留为对象,然后在处理程序中进行转换。当您为参数使用值类型时,某些 DC 实现会出现问题,因为它们不知道如何处理在 Binding 评估之前存在的初始 null 值并以异常结束。
    【解决方案2】:

    不要将控件直接连接在一起,而是在视图模型中引入某种代理属性,这两个控件都绑定到。其中之一是 Mode=TwoWay。

    【讨论】:

    • 我已经将子视图绑定到主视图的选定项。如果不引入代理属性,这是不可能的吗?
    【解决方案3】:

    您可以使用 CollectionViewSource.GetDefaultView() 返回 TabControl 绑定到的 ICollectionView。如果您在 TabControl 上将 IsSynchronizedWithCurrentItem 设置为 true,那么您可以将 ICollectionView 的 Current 属性传递给您的命令

    【讨论】:

      【解决方案4】:

      您的 ViewModel 中需要一个名为 SelectedCause 的属性。将 DataGrid 的 SelectedItem 属性绑定到此 SelectedCause 属性。然后,不是将 TabControl 绑定到 SelectedItem.Solutions,而是将其绑定到 SelectCause.Solutions。由于您遇到的问题,最好这样做。您需要 ViewModel 中的一个属性来表示当前选定的原因。 ViewModel 旨在表示 View 的状态。 DataGrid 中的选定项是该状态的一部分,因此您的 ViewModel 中应该有一个 SelectedCause 属性。

      【讨论】:

        猜你喜欢
        • 2010-11-28
        • 1970-01-01
        • 2018-09-20
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多