在数据网格中选择组合框第一项时,OnPropertyChanged不会触发

时间:2013-04-16 08:54:26

标签: wpf data-binding datagrid combobox

我在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不会更新。怎么了?

1 个答案:

答案 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;
    }
}

这样,如果未设置正确的行类型,则不会提交行。

希望这对某人有用!