2

我有一些控件需要根据一些计算的结果隐藏或禁用。我想将 IsEnabled 或 IsVisible 属性绑定到父表单类的某些方法或属性获取的结果。像这样的东西:

<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;
}

你能帮我找到一个合适的方法来实现这一点吗?

谢谢,吉克拉

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");
  }
}

同样 for ValueB,这将允许 WPFBinding每次更新ValueA或者ValueB更改

您的转换器应如下所示:

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;
}

这将允许您在 Converter 中定义一个外部方法,每次 ValueA 或 ValueB 发生变化时都会再次调用该方法。

我想说这就是你所需要的=)

于 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
  • 作为ValueAValueB成为其他功能的组件,很容易将钩子添加到他们所推崇的OnChanged方法中。
  • 它很容易绑定IsTabEnabled到任何一个IsEnabledVisibility根据需要。
于 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 回答