【问题标题】:How to bind IsEnabled or IsVisible property to a method or property get?如何将 IsEnabled 或 IsVisible 属性绑定到方法或属性获取?
【发布时间】:2012-06-10 12:40:25
【问题描述】:

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

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

谢谢,吉克拉

【问题讨论】:

  • _valueA 和 _valueB 从哪里来,什么时候重新计算?
  • 它们可以是当前类的全局变量,也可以是分配了一些外部计算器类——没关系。我只需要将 IsEnabled 属性绑定到这样的方法或类属性。

标签: c# .net wpf isenabled


【解决方案1】:

您可能需要使用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 在每次 ValueAValueB 更改时更新 Binding

您的转换器应如下所示:

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 发生变化时都会再次调用该方法。

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

【讨论】:

  • 好的,这真的很好。我知道转换器。但我的问题的重点是是否可以将组件的 IsEnabled (或任何)属性绑定到本地方法或类属性。 valueA 和 valueB 无关紧要,这只是一个例子。我是WPF的新手,请不要怪我。那么你能告诉我一个最简单的方法如何将 IsEnabled 绑定到本地方法或类属性,例如真正的虚拟道具,例如: public bool IsItEnabled() { return true; } ?
  • 您通常可以绑定到属性。您可以执行以下操作:public bool IsIsEnabled { get { return true; } },它很容易满足您的需求。 WPF 中绑定到方法的良好做法是使用转换器(或上面的解决方法)。我相信有几种方法可以做到这一点,但我没有看过它,因为转换器可以满足我的需要并且更容易维护
  • 这里列出了一些解决方法:stackoverflow.com/questions/502250/bind-to-a-method-in-wpf 如果您确实需要绑定到某个方法
【解决方案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

【讨论】:

  • 关于在 ViewModel 中而不是在转换器中包含更新条件的要点。
【解决方案3】:

您不能直接绑定到方法。它必须是一个财产。话虽如此,还有一些其他技巧可以绑定到这个问题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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多