1

WPFとMVVMを使用しCheckBoxて、内にデータバインドがあります。DataGrid

<DataGridTemplateColumn Width="80" Header="Enabled">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Path=IsEnabled, UpdateSourceTrigger=PropertyChanged,  Mode=TwoWay}" Name="theCheckbox" HorizontalAlignment="Center"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

これは正常に機能し、が設定さCheckBoxれているときにチェックされますIsEnabledIsEnabledにバインドしたオブジェクトのコレクション内のプロパティDataGridです。私がしたいのは、ユーザーが選択したときに特定の行をチェックできるようにCheckBoxするDataGrid必要があるかどうかを検証できるようにすることです。そうでない場合は、チェックを外して「行 1 は行 5 なしではチェックできません」そして9がチェックされています」。CheckedのおよびUncheckedプロパティを使用してコード ビハインドを使用してこれを行う方法を見つけましたCheckBoxが、MVVM を使用しているため、およびViewModelのビューに関連付けられているものを処理したいと考えています。これを行うにはどうすればよいですか? の Id フィールドを渡す方法が必要ですDataGridCheckBoxDataRow私が作業している行を識別するためにも、引数のために Id フィールドが呼び出されているとしましょうBorderId

4

3 に答える 3

1

検証用の WPF のデフォルト インターフェイスであるオブジェクトにIDataErrorInfoを実装し、チェックボックスをオンにできるかどうかを検証するように検証コードを設定します。

データ項目に存在しないデータを使用してデータ項目のプロパティを検証しているため、これは実際には通常より少しトリッキーです。つまり、実行時に無関係な検証をオブジェクトに関連付ける何らかの方法を提供する必要があります。

私が通常使用する解決策は、オブジェクトから ValidationDelegate を公開することです。これにより、他のオブジェクトが追加の検証をオブジェクトにアタッチできます。そのコードは私のブログに投稿されており、次のようにオブジェクトに検証を添付できます。

public class MyViewModel
{
    // Keeping this generic to reduce code here, but it
    // should be a full property with PropertyChange notification
    public ObservableCollection<SomeObject> SomeCollection { get; set; }

    public MyViewModel()
    {
        SomeCollection = LoadDataGridObjects();

        // Add the validation delegate to each object
        foreach(var item in SomeCollection)
            item.AddValidationDelegate(ValidateObject);
    }

    // Validation Delegate to verify the right checkboxes are checked
    private string ValidateObject(object sender, string propertyName)
    {
        if (propertyName == "IsChecked")
        {
            var item = (SomeObject)sender;
            if (item.Id == 1
                && !SomeCollection.First(p => p.Id == 5).IsChecked
                && !SomeCollection.First(p => p.Id == 9).IsChecked)
            {
                return "Row 1 cannot be checked without rows 5 and 9 being checked";
            }
        }
        return null;
    }
}
于 2012-11-07T17:40:52.020 に答える
0

リスト内の各アイテムのPropertyChangedイベントハンドラーに追加できますか?このようなもの:

foreach (Object x in List)
{
    x.PropertyChanged += OnItemChanged;
}

次に、変更リスナーで、IsEnabledプロパティの変更など、送信者オブジェクトを使用して好きなことを行うことができます。

void OnItemChanged(object sender, PropertyChangedEventArgs e)
{
    // change sender object properties or set bound label text here
}
于 2012-11-07T17:04:10.403 に答える
0

あなたの質問を理解できれば、チェックボックスがあり、チェックできるかどうかを制御したいと考えています。ユーザーに常にチェックさせ、許可したくない場合はエラーメッセージをプッシュバックする代わりに、ユーザーにチェックさせたくない場合は、最初にチェックボックスを非アクティブにします。

ViewModel (もちろん DataContext です) を介してこれを行うには、チェックボックスの「コマンド」を ViewModel のカスタム コマンドにバインドする必要があります。

WPF コマンドは、次の機能を提供します。

  • カスタム ロジックに基づいてコントロールを自動的に有効/無効にする
  • コントロールの「アクション」イベントを処理します (チェックボックスのボタンでは、「クリック」になります)。
于 2012-11-07T17:29:05.323 に答える