我在WPF网格视图中有一个组合框,如下所示:
<DataGridComboBoxColumn Header="Type" SelectedItemBinding="{Binding Path=Type, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Source={my:EnumValues {x:Type my:CommandTypes}}}"
MinWidth="100"/>
这背后的ViewModel是这样的:
public class LoadSimCommand {
public CommandTypes Type
{
get
{
return mType;
}
set
{
mType = value;
switch (mType)
{
/* Set some dependency properties */
}
}
}
}
除了一种情况之外,这很有效:当我点击组合框并从列表中选择第一项时,ViewModel不会更新。怎么了?
答案 0 :(得分:0)
当我输入问题时,我想到了答案。我还是想分享解决方案,以防其他人遇到同样的问题。 ViewModel未更新,因为ViewModel的CommandTypes属性deafult值为0,转换为枚举中的第一个值。因此,当选择第一个项目时,属性不会更改,因此未触发OnPropertyChanged,因为该属性未更改。
现在,我不想引入额外的CommandType来覆盖这个,所以我决定欺骗我的数据类型并使其成为Nullable如下:
public CommandTypes? Type;
现在Type的初始值为null,我可以使用value.HasValue
进行一些健全性测试。我还将我想在switch
中设置的依赖项属性的初始状态更改为“无效”值,以便我的UI状态仍然一致。
作为最后一步,我添加了一个RowEditEnding事件处理程序,其中包含以下内容:
private void DataGridView_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
// Check if the entered type is not null
if (!(e.Row.Item is LoadSimCommand) ||
(e.Row.Item as LoadSimCommand).Type == null)
{
e.Cancel = true;
}
}
这样,如果未设置正确的行类型,则不会提交行。
希望这对某人有用!