1

WPF アプリケーションに 3 つの CheckBox があり、ViewModel のプロパティに従って CheckBox を無効/有効にする必要があります。

<Grid>
    <CheckBox x:Name="cbTest1" Margin="12,341,476,5" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <CheckBox x:Name="cbTest3" Margin="74,341,414,5" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay }" />
    <CheckBox x:Name="cbTest2" Margin="131,341,359,5" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay }" />
    <Button x:Name="btnClick" Click="btnClick_Click" Margin="231,333,29,5" />
</Grid>

私のテスト アプリケーションでは、ボタン クリック用のコード ビハインドを作成しました。

private void btnClick_Click(object sender, RoutedEventArgs e)
    {
        if (_boolProperty == true)
        {
            _boolProperty = false;
            cbTest1.IsEnabled = false;
        }
        else
        {
            _boolProperty = true;
            cbTest1.IsEnabled = true;
        }
    }

奇妙な動作は、コメントすると、cbTest1.IsEnabled = false;またはcbTest1.IsEnabled = true;CheckBox es が無効のままになることです。

ただし、1 つの CheckBox のみを変更すると、「cbTest1」の値がtrue他の checkBox にも変更を加えます。cbTest1.IsEnabled = true;3 つの CheckBox がすべて有効になっている場合と同様です。その場合cbTest1.IsEnabled = false;、3 つの CheckBox がすべて無効になります。

誰でも私に教えてください。なぜこうなった?ここでバインディングはどのように行われますか? もう 1 つの質問ですが、checkBoxes の isEnabled プロパティを viewModel のプロパティにバインドするにはどうすればよいですか?

4

3 に答える 3

1
<CheckBox x:Name="cbTest1" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay}" />
<CheckBox x:Name="cbTest3" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay}" />
<CheckBox x:Name="cbTest2" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay}" />

3 つのチェック ボックスはすべて同じソースにバインドされるため、何をしても常に同じ状態を共有します。さらに、バインディングは双方向バインディングであるためIsEnabled、1 つのチェックボックスを手動で設定すると、バインドされた基になるプロパティも変更され、他の 2 つのチェックボックスが更新されます。

個別の状態が必要な場合は、3 つの異なるプロパティを使用してバインドする必要があります。

viewModel のプロパティで checkBoxes isEnabled プロパティをバインドするにはどうすればよいですか?

あなたがしたことはすでに正しいです(共有プロパティを除いて)。したがって、 にバインドしBoolProperty1、それらBoolProperty2BoolProperty3各プロパティがビュー モデルに存在する場合は、すべて問題ありません。チェックボックスがデータ コンテキストとしてビュー モデルを持っていることを確認するだけです。Windowこれは通常、親コンポーネント (多くの場合それ自体) にデータ コンテキストを与えることによって実現されます。

Window window = new MyWindow();
window.DataContext = new MyViewModel();
window.Show();
于 2013-09-19T10:19:41.553 に答える
1

これは、持っている各 checkBox の TwoWay バインディングが原因で発生しています。それらの 1 つを有効にすると、対応するビュー モデル プロパティが True に設定され、TwoWay バインディングは他のチェック ボックスも True に切り替えます。それがあなたがこの問題を抱えている主な理由です。

次に、これらのチェックボックスから何が必要かを判断しましょう。各チェックボックスを個別に変更する場合は、チェックボックスごとに 3 つの異なるビュー モデルのプロパティが必要です。それ以外の場合は、1 つの VM フィールドにのみバインドするため、動作は正常です。

<Grid>
    <CheckBox x:Name="cbTest1" Margin="12,341,476,5" IsEnabled="{Binding Path=BoolProperty1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <CheckBox x:Name="cbTest3" Margin="74,341,414,5" IsEnabled="{Binding Path=BoolProperty2, Mode=TwoWay }" />
    <CheckBox x:Name="cbTest2" Margin="131,341,359,5" IsEnabled="{Binding Path=BoolProperty3, Mode=TwoWay }" />
    <Button x:Name="btnClick" Click="btnClick_Click" Margin="231,333,29,5" />
</Grid>

上記の @dzavala のように、チェックボックス自体ではなく、ビュー モデル プロパティの値を変更する必要があります。ボタン クリック イベントにはコマンドを使用する必要があります。コマンド、RelayCommands、EventToCommand、およびICommand インターフェイスをお読みください

于 2013-09-19T10:20:31.277 に答える
0

プライベート フィールドを設定する代わりに_boolProperty、プロパティBoolPropertyを設定し、そのセッターで PropertyChanged イベントを発生させます。

于 2013-09-19T10:12:52.550 に答える