MVVM WPF:根据所选项从 DataGridComboBoxColumn 中删除元素



目前我有一个包含一些列的数据网格。其中一列是 DataGridComboBoxColumn。 这绑定到两个类。SelectedValueBinding 绑定到我的模型类属性 HMDGroup。项目源绑定到我的视图模型中名为 HMDGroups 的列表;

我正在寻找一种从组合框中的列表中删除项目的方法,具体取决于是否在同一列的另一个组合框中选择了相同的项目。

例如,我已经为两个单元格选择了 136b6407 和 136b6408,除非从其他单元格中删除,否则应该无法在下一个单元格中再次选择它们。

图像显示示例

我对 MVVM模式很陌生,不确定如何以 MVVM 方式解决这个问题,因为它绑定到一个列表。

非常感谢您的帮助!

XAML:

<DataGrid Name="VariantHandlerDatagrid" AutoGenerateColumns="False" Grid.ColumnSpan="3" Grid.RowSpan="1" ItemsSource="{Binding variantHandlerItems}" SelectionUnit="Cell" CanUserReorderColumns="False" CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="False" GridLinesVisibility="None"
HeadersVisibility="Column" CanUserSortColumns="True" HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="auto" ColumnWidth="*" >
<DataGrid.Resources>
<local:VHViewModel x:Key="ComboItems"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Variant Name" Binding="{Binding Variant}" IsReadOnly="True"/>
<DataGridComboBoxColumn x:Name="hmdComboCol" Header="HMD Group" 
SelectedValueBinding="{Binding HMDGroup, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
ItemsSource="{Binding Path=HMDGroups, Source={StaticResource ComboItems}}"/> 
</DataGrid.Columns>
</DataGrid>

视图模型:

sealed class VHViewModel : INotifyPropertyChanged
{

private List<string> usedHMDGroups = new List<string>();
private List<string> startHMDGroups = new List<string>{
"136b6405",
"136b6406",
"136b6407",
"136b6408",
"136b6409",
"136b6410",
"None"
};
public List<string> HMDGroups
{
get 
{
return startHMDGroups;

}
set 
{
startHMDGroups = value;
OnPropertyChange("HMDGroups");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChange(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

型:

sealed class VariantMapping : INotifyPropertyChanged
{
private string hmdGroup;
public string HMDGroup
{
get { return hmdGroup; }
set
{
hmdGroup = value;
if (String.IsNullOrEmpty(hmdGroup))
{
if (String.IsNullOrEmpty(smdGroup))
{
variant = "None";
OnPropertyChange("Variant");
OnPropertyChange("HMDGroup");
}
else
{
variant = smdGroup;
OnPropertyChange("Variant");
OnPropertyChange("HMDGroup");
}
}
else
{
variant = hmdGroup;
OnPropertyChange("Variant");
OnPropertyChange("HMDGroup");
}
}
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChange(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

您必须使用具有值136b6407ComboBoxSelectedValue,并且列表绑定到其他ComboBox

一些提示可以做到这一点。

方式 1

通过从绑定列表中删除所选项,让主网格视图模型将ComboBox的选定值与值136b6407同步到其他ComboBox。这种方式有些无聊,因为您需要实现一种机制来同步手动绑定到ComboBoxes的 2 ViewModel

方式 2

此解决方案可为您提供更好的代码维护,并且还允许您比第一个解决方案更少的代码。

您需要使用消息代理设计模式 https://en.wikipedia.org/wiki/Message_broker 您可以实现自己的消息代理,或者仅使用已实现它的任何 MVVM 工具包库之一。大多数现有的 MVVM 工具包都有自己的消息代理实现。所以没有必要重新发明地狱。

例如,MVVM Light Toolkit Message Broker 的说明如下:https://learn.microsoft.com/en-us/archive/msdn-magazine/2014/june/mvvm-the-mvvm-light-messenger-in-depth#using-messages

因此,当 ComboBox 的 SelectedValue 具有值136b6407ViewModel 绑定到其他 ComboBox 时,您可以让代理发送一条消息,并响应从其自己的绑定列表中删除该项目。

要获取更多信息,请查看有关此解决方案的 SO 答案:如何在 PropertyChange 上更改可观察集合元素中的特定属性?

相关内容

  • 没有找到相关文章

最新更新