2

いくつかの計算結果に基づいて非表示または無効にする必要のあるコントロールがいくつかあります。IsEnabledまたはIsVisibleプロパティを、親フォームクラスのメソッドまたはプロパティgetの結果にバインドしたいと思います。このようなもの:

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding MyMethod}">
    <!--Some other stuff-->
</TabItem>

そして背後にあるコードで:

public bool MyMethod()
{
    return _valueA + _valueB == 2;
}

これを達成するための適切な方法を見つけるのを手伝ってもらえますか?

Thx、JiKra

4

3 に答える 3

3

を使用する必要がある場合がありますMultiBinding

<TabItem Name="MyTab" Header="This should be enabled when result is 2">
  <TabItem.IsEnabled>
     <MultiBinding Converter={StaticResource MyAddConverter}>
         <Binding Path=ValueA UpdateSourceTrigger=PropertyChanged />
         <Binding Path=ValueB UpdateSourceTrigger=PropertyChanged />
     </MultiBinding>
  </TabItem.IsEnabled>
    <!--Some other stuff-->
</TabItem>

ViewModel には、次のものが必要です (ViewModel が を実装していると仮定しますINotifyPropertyChanged)。

public double ValueA
{
  get { return _valueA; }
  set 
  {
    _valueA = value;
    OnPropertyChanged("ValueA");
  }
}

についても同様でValueB、これにより、WPF はまたはが変更Bindingされるたびに を更新できます。ValueAValueB

コンバーターは次のようになります。

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
  double valueA = (double)values[0];
  double valueB = (double)values[1];
  return valueA + valueB == 2;
}

これにより、ValueA または ValueB が変更されるたびに再度呼び出される、Converter で定義された 1 つの外部メソッドを持つことができます。

必要なのはそれだけだと思います=)

于 2012-06-06T14:11:43.663 に答える
2

ここで達成しようとしている値を表す新しいプロパティを作成する必要があります。これが、ビュー モデルの全体的な目的です。コンバーターは機能しますが、ここでは使用しないことを強くお勧めします。これはビュー ステートの問題ですが、ビューのみの問題を処理するにはコンバータを使用する必要があります。

潜在的なビューモデルは次のようになります: (私はBindableBaseを使用しています)

class AddingViewModel : BindableBase {
    private int _valueA;
    public int ValueA {
        get { return _valueA; }
        set { SetProperty(ref _valueA, value, "ValueA", OnValueAChanged); }
    }

    private void OnValueAChanged() { UpdateIsTabEnabled(); }

    private int _valueB;
    public int ValueB {
        get { return _valueB; }
        set { SetProperty(ref _valueB, value, "ValueB", OnValueBChanged); }
    }

    private void OnValueBChanged() { UpdateIsTabEnabled(); }

    private bool _isTabeEnabled;
    public bool IsTabEnabled {
        get { return _isTabEnabled; }
        private set { SetProperty(ref _isTabEnabled, value, "IsTabEnabled"); }
    }

    private void UpdateIsTabEnabled() {
        IsTabEnabled = _valueA + _valueB == 2;
    }
}

これは少し冗長に思えるかもしれませんが、この理由をいくつか強調したいと思います。

  • 要件が変化しても、簡単に見つけて変更できますUpdateIsTabsEnabled
  • 他の機能のコンポーネントとしてValueA、それらの重要なメソッドValueBにフックを追加するのは簡単です。OnChanged
  • IsTabEnabledいずれかIsEnabledまたは必要に応じてバインドするのは簡単Visibilityです。
于 2012-06-06T16:16:12.103 に答える
1

メソッドに直接バインドすることはできません。プロパティである必要があります。そうは言っても、この質問Bind to a method in WPF? に示されているメソッドにバインドするための他のトリックがいくつかありますか? .

あなたの質問に戻ると、私は MyMethod をプロパティにすることです。

public double SumAB
{
    get{ return _valueA + _valueB;}
}

次に、バインディング用のコンバーターを追加します。

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding SumAB, Converter={StaticResource SumValueToBoolConverter}}">

コンバーターのコードは次のようになります。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    double sumValue = (double)value;
    if(sumValue==2)
    {
        return true;
    }
    return false;
}
于 2012-06-06T15:51:09.000 に答える