0

複数の RadioButton を 1 つのグループにまとめて、1 つだけをチェックできるようにしています。RadioButton はブール値のプロパティにバインドされています。

これは非常にうまく機能し、私のプログラムはこれらのプロパティの変更に反応します。

が選択されたとしoptAます。次に を選択するoptBと、 の値がPropertyBtrue に設定され、それに応じてプログラムが反応します。ただし、現時点では、ラジオ ボタンのグループが false に更新されるまで trueoptAとtrue の両方が trueになり、"IsSelected" イベントが再度トリガーされます。optBoptA

これは完全に正しい動作だと思います...しかし、ユーザーからの変更とグループからの自動変更をどのように区別できますか?

編集:コード

<RadioButton Name="featureCheckBox" GroupName="featureRadioButtonGroup" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" />

 public bool IsSelected { 

        get{ return _isSelected; }
        set { PropertyChanged.ChangeAndNotify(ref _isSelected, value, () => IsSelected); }
    }
4

2 に答える 2

2

まず、あなたの質問に答えてください。

IsSelected プロパティの設定部分を次のように変更します。(もちろん、if ステートメントの実際のコードを記述する必要があります)。

public bool IsSelected 
{ 

    get{ return _isSelected; }
    set 
    {
        //If two options are true wait for the second change of values
        //You will now only get One notification per change.
        if (twoOptions are selected) return;
        else PropertyChanged.ChangeAndNotify(ref _isSelected, value, () => IsSelected); 
    }
}

代わりに false 値をリッスンすることもできますが、最初に任意のオプションを true に設定する必要があります。または、true 値をリッスンしてすべての false 値を無視することもできます。これは、グループ ボックスが古いオプションを false に更新するまで、複数のプロパティが true になるという問題が発生することを意味します。

今アドバイスのために。

はるかに優れたモデルはこれでしょう。

  1. オプションごとにブール値のプロパティを作成します。(optA、optB、optC など)
  2. これらのプロパティの 1 つが true に設定されている場合、プロパティが宣言されているモデル内のコードを介して、他のすべてのオプションを false に設定します。
  3. 各ラジオ ボタンをオプションにバインドしますbut do NOT group them。(それらをグループ化すると、UI は強制的に 1 つだけを選択するようになります。これは、UI とビジネス ロジックの分離には適していません。)

このようにすることのいくつかの利点。

  1. UI を切り取って、ビジネス ロジックを変更せずに別のものに変更できます。(つまり、コードを変更することなく、プロパティを RadioButtons、ToggleButtons などにバインドできANYます。)
  2. UI さえ必要ないため、ビジネス ロジックの単体テストをより簡単に行うことができます。
  3. オプションのカスタム グループ化を実装できます。(おそらく、optC と一緒に選択するのに実際に有効な optZ を追加します。この場合、一度に 1 つのオプションしか選択できないことを示すため、ラジオ ボタンから離れたいと思うでしょう)
于 2012-11-01T03:46:20.843 に答える
0

値で区別できると思います。Trueラジオボタンの選択を解除することはできず、false常に に設定された別の値から取得されるため、常にユーザーから設定されtrueます。

于 2012-11-01T09:16:30.213 に答える