C# 带有datagrid和TabControl的WPF MVVM主详细视图

C# 带有datagrid和TabControl的WPF MVVM主详细视图,c#,.net,wpf,mvvm,binding,C#,.net,Wpf,Mvvm,Binding,我试图在WPF MVVM中实现一个主细节视图 在我的viewmodel中,我有一个可观察的“原因”集合。每个原因都有一个可观察的“解决方案”集合 我将一个可编辑的Datagrid绑定到原因,它工作正常。但是,当用户在DataGrid中选择一行时,我希望允许用户在TabControl中查看其关联的解决方案 我该怎么做呢?我是否应该在Viewmodel中创建属性CurrentCause并将其绑定到SelectedItem。在选项卡控件中,我可以绑定到CurrentCause.Solutions 这是

我试图在WPF MVVM中实现一个主细节视图

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

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

我该怎么做呢?我是否应该在Viewmodel中创建属性CurrentCause并将其绑定到SelectedItem。在选项卡控件中,我可以绑定到CurrentCause.Solutions


这是一个最佳的方法吗?请告知。谢谢

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

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

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

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


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

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

我会将您的DataGrid绑定到原因列表,将SelectedItem绑定到模型中的CurrentCause,将TabControl绑定到Solutions。然后将所有内容都很好地绑定到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}"...
私人原因\u当前原因;
公共事业
{
获取{return\u currentCause;}
设置
{
if(_currentCause==值)返回;
CurrentSolution=\u currentCause.Solutions;//无论您如何执行此操作。。。
_当前原因=值;
RaisePropertyChanged(“当前原因”);
}
}
私人可观察到的收集原因;
公众可观察到的收集原因
{
获取{返回_原因;}
设置
{
_原因=价值;
RaiseProperty变更(“原因”);
}
}
私有可观察收集解决方案;
公共可观测收集解决方案
{
获取{return\u solutions;}
设置
{
_解决方案=价值;
RaiseProperty变更(“公司”);
}
}

我会将您的DataGrid绑定到原因列表,将SelectedItem绑定到模型中的CurrentCause,将TabControl绑定到Solutions。然后将所有内容都很好地绑定到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}"...
私人原因\u当前原因;
公共事业
{
获取{return\u currentCause;}
设置
{
if(_currentCause==值)返回;
CurrentSolution=\u currentCause.Solutions;//无论您如何执行此操作。。。
_当前原因=值;
RaisePropertyChanged(“当前原因”);
}
}
私人可观察到的收集原因;
公众可观察到的收集原因
{
获取{返回_原因;}
设置
{
_原因=价值;
RaiseProperty变更(“原因”);
}
}
私有可观察收集解决方案;
公共可观测收集解决方案
{
获取{return\u solutions;}
设置
{
_解决方案=价值;
RaiseProperty变更(“公司”);
}
}

真正地是否也可以将DataContext绑定到另一个控件?我应该使用DataContext={Binding Path=CauseControlName.SelectedItem}吗?是的,您可以绑定DataContext,但是如果您想将每个解决方案显示为选项卡,那么您需要绑定ItemsSource它不起作用:(我的TabConrol完全为空。我在主DataGrid中尝试了x:Name和Name我也尝试了此语法-ItemsSource=”{Binding SelectedItem,ElementName=CauseDataGrid}但它仍然是空的…:'(我刚刚尝试了这个方法,它可以工作,您的原因和解决方案类型是否实现INotifyPropertyChanged?您使用的是属性而不是公共字段?真的吗?是否可以将DataContext绑定到另一个控件?我是否应该使用DataContext={Binding Path=CauseControlName.SelectedItem}?是的,您可以绑定DataContext,但如果您想将每个解决方案显示为选项卡,则需要绑定ItemsSource它不起作用:(我的TabConrol完全为空。我在主DataGrid中尝试了x:Name和Name我也尝试了此语法-ItemsSource=”{Binding SelectedItem,ElementName=CauseDataGrid}但它仍然是空的…:'(我刚刚尝试了这个方法,它可以工作,您的原因和解决方案类型是否实现INotifyPropertyChanged?您使用的是属性而不是公共字段吗?我尝试设置父堆栈面板的DataContext,但它不起作用。现在,使用Dev的方法解决了这个问题。)将TabControl的ItemSource绑定到DataGrid的选定项。感谢您的帮助,我尝试设置父堆栈面板的DataContext,但它不起作用。现在,使用Dev将TabControl的ItemSource绑定到选定项的方法,问题就解决了DataGrid的em。感谢您的帮助谢谢,但我可以在没有额外属性的情况下实现此功能。但是我可能需要解决其他问题:(谢谢,但我可以在没有额外属性的情况下实现此功能。但是我可能需要解决其他问题:(