【问题标题】:WPF MVVM Master detail view with a datagrid and a TabControl带有数据网格和 TabControl 的 WPF MVVM 主详细信息视图
【发布时间】:2011-10-05 03:51:32
【问题描述】:

我正在尝试在 WPF MVVM 中实现主详细信息视图。

在我的视图模型中,我有一个可观察到的“原因”集合。每个原因都有一个可观察的“解决方案”集合。

我将一个可编辑的 Datagrid 绑定到原因,它工作正常。但是,当用户在 DataGrid 中选择一行时,我希望允许用户在 TabControl 中查看其关联的解决方案。

我该怎么做呢?我是否应该在 Viewmodel 中创建一个属性 CurrentCause 并将其绑定到 SelectedItem。在 TabControl 中我可以绑定到 CurrentCause.Solutions。

这会是最佳方法吗?请指教。谢谢!!

【问题讨论】:

    标签: c# .net wpf mvvm binding


    【解决方案1】:

    您可以使用元素绑定将 TabControl 的 ItemsSource 绑定为 DataGrid 的 SelectedItem

    <TabControl ItemsSource="{Binding ElementName=myDataGrid, Path=SelectedItem.Solutions}">
    

    【讨论】:

    • 真的吗?是否也可以将 DataContext 绑定到另一个控件?我应该使用 DataContext = {Binding Path=CauseControlName.SelectedItem} 吗?
    • 是的,您可以绑定 DataContext,但如果您想将每个解决方案显示为选项卡,则需要绑定 ItemsSource
    • 它不起作用 :( 我的 TabConrol 完全空白。我在主数据网格中尝试了 x:Name 和 Name
    • 我也尝试过这种语法 - ItemsSource="{Binding SelectedItem, ElementName=CauseDataGrid} 但它仍然是空白... :'(
    • 我刚刚尝试过,它有效,您的原因和解决方案类型是否实现了 INotifyPropertyChanged?您使用的是属性而不是公共字段吗?
    【解决方案2】:

    您可以将 IsSynchronizedWithCurrentItem 设置为 True 并执行类似this 的操作。

    【讨论】:

    • 我试图设置父堆栈面板的DataContext 但它不起作用。
    • 问题现在通过 Dev 将 TabControl 的 ItemSource 绑定到 DataGrid 的选定项的方法解决了。感谢您的帮助
    【解决方案3】:

    我会将您的 DataGrid 绑定到原因列表,将 SelectedItem 绑定到模型中的 CurrentCause,并将 TabControl 绑定到解决方案。然后,您将所有内容都很好地绑定到您的 MVVM 中。

    private Cause _currentCause;
    public Cause CurrentCause
    {
        get { return _currentCause; }
        set
        {
            if (_currentCause == value) return;
                CurrentSolution = _currentCause.Solutions;  //However you do this...
            _currentCause = value;
    
            RaisePropertyChanged("CurrentCause");
        }
    }
    
    private ObservableCollection<Cause> _causes;
    public ObservableCollection<Cause> Causes
    {
        get { return _causes; }
        set
        {
            _causes = value;
            RaisePropertyChanged("Causes");
        }
    }
    private ObservableCollection<Solution> _solutions;
    public ObservableCollection<Solution> Solutions
    {
        get { return _solutions; }
        set
        {
            _solutions = value;
            RaisePropertyChanged("Companies");
        }
    }
    
    
    
    <dg:DataGrid ItemsSource="{Binding Causes}" SelectedItem="{Binding CurrentCause}"...
    

    【讨论】:

    • 谢谢,但我能够在没有额外属性的情况下实现这一目标。但我可能需要解决其他问题:(
    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2011-02-11
    • 2010-09-28
    • 1970-01-01
    • 2011-01-30
    • 2010-11-27
    • 2011-03-06
    • 2018-05-22
    相关资源
    最近更新 更多