如何将IsEnabled或IsVisible属性绑定到方法或属性get?

时间:2012-06-06 13:29:29

标签: c# .net wpf isenabled

我有一些控件需要根据某些计算结果隐藏或禁用。 我想将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

3 个答案:

答案 0 :(得分: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,每当BindingValueA更改时,WPF都会更新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更改时都会再次调用该方法。

我会说你需要的只是=)

答案 1 :(得分: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很容易。

答案 2 :(得分: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;
}