【发布时间】:2020-07-01 08:11:42
【问题描述】:
目前我有一个包含一些列的数据网格。这些列之一是 DataGridComboBoxColumn。 这绑定到两个类。 SelectedValueBinding 绑定到名为 HMDGroup 的模型类属性。项目源绑定到我的 ViewModel 中名为 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));
}
}
【问题讨论】:
-
您通过将视图绑定到模型来破坏 MVVM。视图不应该知道模型的存在。
-
@Bizhan 我应该如何绑定列以获得单元格中的正确值?
-
这里的关键是在
HDMGroup属性的设置器中添加逻辑,以便在调用时从HMDGroups集合中删除该项目。您的HMDGroups集合也必须是ObservableCollection而不是List,因为列表不会在删除或添加项目时通知 UI。 -
遵守 MVVM 原则。
V <-> VM -> M。通常您需要为视图的每个部分实现一个虚拟机。并在每个 VM 中提供读取或写入模型的逻辑。有时为了方便起见,最好将 Model 的引用保留在 VM 中。但是您需要对模型的状态保持谨慎,以确保它没有过时
标签: c# wpf xaml mvvm datagridcomboboxcolumn