0

次のような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 */
            }
        }
    }
}

これは、1 つのケースを除いてうまく機能します。コンボボックスをクリックしてリストから最初の項目を選択すると、ViewModel は更新されません。どうしたの?

4

1 に答える 1

0

質問を入力しているときに、答えを考えました。他の誰かが同じ問題を経験している場合に備えて、解決策を共有したかった. ViewModel の CommandTypes プロパティのデフォルト値が 0 であり、列挙の最初の値に変換されるため、ViewModel は更新されません。したがって、最初の項目が選択されたとき、プロパティは変更されないため、プロパティが変更されていないため、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;
    }
}

そうすれば、適切な行タイプが設定されていない場合、行はコミットされません。

これが誰かに役立つことを願っています!

于 2013-04-16T09:02:12.420 に答える