目前我有一个包含一些列的数据网格。其中一列是 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));
}
}
您必须使用具有值136b6407
的ComboBox
SelectedValue
,并且列表绑定到其他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 具有值136b6407
ViewModel 绑定到其他 ComboBox 时,您可以让代理发送一条消息,并响应从其自己的绑定列表中删除该项目。
要获取更多信息,请查看有关此解决方案的 SO 答案:如何在 PropertyChange 上更改可观察集合元素中的特定属性?