0

我在 WPF gridview 中有一个组合框,如下所示:

 <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 没有更新。怎么了?

4

1 回答 1

0

当我输入问题时,我想到了答案。我仍然想分享解决方案,以防其他人遇到同样的问题。ViewModel 没有更新,因为 ViewModel 的 CommandTypes 属性默认值为 0,它转换为枚举中的第一个值。Therefore, when the first item is selected, the property isn't changed and therefore OnPropertyChanged is not fired because the property hasn't changed.

现在,我不想引入一个额外的 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;
    }
}

这样,当未设置正确的行类型时,不会提交该行。

希望这对某人有用!

于 2013-04-16T09:02:12.420 回答