C# wpf DataGrid MVVM中的2个相关组合框

C# wpf DataGrid MVVM中的2个相关组合框,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,有人举过将2个相关ComboBox绑定到DataGrid的选定项的例子吗?我试过了,但似乎没能成功。我是MVVM的新手,所以我做错了什么 我有一个datagrid,它绑定到ViewModel中名为NewClient的对象中的集合 clientmarketcode。 ClientMarketCodes具有名为MarketCodeTypes的导航属性,该属性具有市场导航属性。所以我想在数据网格中显示代码,MarketCodeTyeName,MarketName。 我已经成功地在DataGrid组合框

有人举过将2个相关ComboBox绑定到DataGrid的选定项的例子吗?我试过了,但似乎没能成功。我是MVVM的新手,所以我做错了什么

我有一个datagrid,它绑定到ViewModel中名为
NewClient
的对象中的集合
clientmarketcode
ClientMarketCodes
具有名为
MarketCodeTypes
的导航属性,该属性具有市场导航属性。所以我想在数据网格中显示代码,
MarketCodeTyeName
MarketName
。 我已经成功地在DataGrid组合框中显示了
Markets
MarketCodeTypes
,但我想在
Markets
MaketCodeTypes
之间建立一种关系,用户只能选择与之相关的
MarketCodeTypes
。 我已将所选项目添加到
Markets
Combobox,其中更改后执行绑定到
MarketCodeTypes
Combobox的
MarketCodeTypes
集合的填充方法,但由于过滤器应用于
MarketCodeTypes
Combobox列的所有行,因此无法正常工作。 我在两个组合框中都出现了一些情况,例如更改一行的
市场
。组合框显示所有其他市场我选择了另一个市场,单击该行不受影响并返回其原始市场。我不知道为什么会发生这种情况

这是我的视图模型:

public class MarketsViewModel : ObservableObject, IMarketsViewModel, INavigationAware, IConfirmNavigationRequest, IRegionMemberLifetime
{
    #region MarketsViewModel

    public MarketsViewModel()
    {
        //NewClient.ClientMarketCodes[0].MarketCodeType.MarketID
        //MarketCodeTypes = new ObservableCollection<MarketCodeType>();
        this.GetMarkets();
        //this.GetMarketCodeTypes();
        this.PropertyChanged += MarketssViewModel_PropertyChanged;
    }

    private void MarketssViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "selectedMarket":
            {
                if (selectedMarket != null)
                {
                    GetMarketCodeTypes();
                }

                break;
            }
        }
    }

    #endregion

    #region --Members--

    private ObservableCollection<Market> m_Market;
    private ObservableCollection<MarketCodeType> m_MarketCodeType;
    private List<MarketCodeType> m_MarketCodeTypes;

    public List<MarketCodeType> MarketCodeTypesList
    {
        get
        {
            if (m_MarketCodeTypes == null)
            {
                m_MarketCodeTypes = new List<MarketCodeType>();
            }

            return m_MarketCodeTypes;
        }
        set
        { 
            m_MarketCodeTypes = value;

            RaisePropertyChanged("MarketCodeTypesList");
            RaisePropertyChanged("MarketCodeTypes");
        }
    }

    public ObservableCollection<MarketCodeType> MarketCodeTypes
    {
        get
        {
            if (MarketCodeTypesList != null)
                return new ObservableCollection<MarketCodeType>(MarketCodeTypesList);
            else
                return new ObservableCollection<MarketCodeType>();
        }
    }

    #endregion

    #region --Properties--

    public ObservableCollection<Market> Markets
    {
        get { return m_Market; }
        set
        {
            m_Market = value;
            RaisePropertyChanged("Markets");
        }
    }

    private Market _selectedMarket;
    public Market selectedMarket
    {
        get { return _selectedMarket; }
        set
        {
            if (_selectedMarket != value)
            {
                _selectedMarket = value;
                RaisePropertyChanged("selectedMarket");
                RaisePropertyChanged("MarketCodeTypes");
            }
        }
    }

    #endregion

    private void GetMarkets()
    {
        try
        {
            Market[] MarketArr;

            using (var client = new ClientServiceProxy())
            {
                MarketArr = client.GetAllMarkets();
            }
            if (MarketArr != null)
            {
                this.Markets = new ObservableCollection<Market>(MarketArr);
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }

    private void GetMarketCodeTypes()
    {
        try
        {
            MarketCodeType[] MarketCodeTypeArr;
            using (var client = new ClientServiceProxy())
            {
                MarketCodeTypeArr = client.GetAllMarketCodeTypes().Where(c=>c.MarketID==selectedMarket.marketID).ToArray();
            }
            if (MarketCodeTypeArr != null)
            {
                MarketCodeTypesList = MarketCodeTypeArr.ToList();
            }
            else
            { MarketCodeTypesList = new List<MarketCodeType>(); }

        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }
}`
public类MarketsViewModel:observeObject、IMarketsViewModel、iAvigationAware、IConfirmNavigationRequest、IRegionMemberLifetime
{
#区域市场可视模型
公共市场可视模型()
{
//NewClient.ClientMarketCodes[0]。MarketCodeType.MarketID
//MarketCodeTypes=新的ObservableCollection();
这个。GetMarkets();
//这个.GetMarketCodeTypes();
this.PropertyChanged+=MarketsViewModel\u PropertyChanged;
}
私有void MarketsViewModel\u PropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
开关(如PropertyName)
{
案例“selectedMarket”:
{
如果(selectedMarket!=null)
{
GetMarketCodeTypes();
}
打破
}
}
}
#端区
#地区——成员--
私人可观测集市;
私有可观察收集m_MarketCodeType;
私有列表m_MarketCodeType;
公共列表MarketCodeTypesList
{
得到
{
if(m_MarketCodeTypes==null)
{
m_MarketCodeTypes=新列表();
}
返回m_MarketCodeType;
}
设置
{ 
m_MarketCodeTypes=值;
RaisePropertyChanged(“MarketCodeTypesList”);
RaisePropertyChanged(“MarketCodeType”);
}
}
公共可观察收集MarketCodeType
{
得到
{
if(MarketCodeTypesList!=null)
返回新的ObservableCollection(MarketCodeTypesList);
其他的
返回新的ObservableCollection();
}
}
#端区
#区域--属性--
公开募捐市场
{
获取{返回m_市场;}
设置
{
m_市场=价值;
融资产权变更(“市场”);
}
}
私人市场(选择市场);;
公开市场选择市场
{
获取{return\u selectedMarket;}
设置
{
如果(_selectedMarket!=值)
{
_selectedMarket=值;
RaisePropertyChanged(“selectedMarket”);
RaisePropertyChanged(“MarketCodeType”);
}
}
}
#端区
私人市场()
{
尝试
{
市场【】市场arr;
使用(var client=new ClientServiceProxy())
{
MarketArr=client.GetAllMarkets();
}
if(MarketArr!=null)
{
此。市场=新的可观察集合(MarketArr);
}
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
}
私有void GetMarketCodeTypes()
{
尝试
{
MarketCodeType[]MarketCodeTypeArr;
使用(var client=new ClientServiceProxy())
{
MarketCodeTypeArr=client.GetAllMarketCodeTypes()。其中(c=>c.MarketID==selectedMarket.MarketID.ToArray();
}
如果(MarketCodeTypeArr!=null)
{
MarketCodeTypesList=MarketCodeTypeArr.ToList();
}
其他的
{MarketCodeTypesList=新列表();}
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
}
}`
这是我的Xaml:

 <Grid x:Name="grid2" RenderTransformOrigin="0.5,0.5">

        <Custom:C1DataGrid x:Name="c1DataGrid"  
                           AutoGenerateColumns="False"
                           Height="490"  
                           ItemsSource="{Binding Path=NewClient.ClientMarketCodes,Mode=TwoWay,UpdateSourceTrigger=LostFocus,ValidatesOnDataErrors=True,ValidatesOnExceptions=True}">
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FFBEBE00" Offset="0.5"/>
                    <GradientStop Color="#FFEDED9A" Offset="0.496"/>
                </LinearGradientBrush>
            </Custom:C1DataGrid.HeaderBackground>
            <Custom:C1DataGrid.Columns>
                <!--<Custom:DataGridCheckBoxColumn  Header="???? ?????"/>-->
                <Custom:DataGridTextColumn Header="Code" Binding="{Binding Code,Mode=TwoWay}" IsReadOnly="False"  />

                <Custom:DataGridTemplateColumn Header="MarketCodeType" >
                    <Custom:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding MarketCodeType.NameA}"/>
                        </DataTemplate>
                    </Custom:DataGridTemplateColumn.CellTemplate>
                    <Custom:DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                          <ComboBox  Name="cmbMarketCodeTypes" 
                                                 ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.MarketCodeTypes}" 
                                                 DisplayMemberPath="NameA" 
                                                 SelectedValue="{Binding Path=MarketCodeTypeID,Mode=TwoWay,ValidatesOnDataErrors=True}" 
                                                />
                        </DataTemplate>
                    </Custom:DataGridTemplateColumn.CellEditingTemplate>
                </Custom:DataGridTemplateColumn>

                <Custom:DataGridTemplateColumn Header="Markets">
                    <Custom:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding MarketCodeType.Market.NameA}"/>
                        </DataTemplate>
                    </Custom:DataGridTemplateColumn.CellTemplate>
                    <Custom:DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox Name="cmbMarkets" ItemsSource= "{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.Markets,Mode=TwoWay}" 
  DisplayMemberPath="NameA" SelectedValue="{Binding Path=MarketCodeType.Market.MarketID,Mode=TwoWay}" 
                SelectedValuePath="MarketCodeType.MarketID"
       SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.selectedMarket,Mode=TwoWay}"    />
                        </DataTemplate>
                    </Custom:DataGridTemplateColumn.CellEditingTemplate>
                </Custom:DataGridTemplateColumn> 


                </Custom:DataGridTemplateColumn>
            </Custom:C1DataGrid.Columns>

        </Custom:C1DataGrid>


我建议使用我在这里描述的转换器:谢谢,我将使用c I,但我需要知道,在从组合框中选择一个项目后,我无法更新任何组合框列,它将返回其原始值。例如,设置市场的第一行