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

C# 如何将IsEnabled或IsVisible属性绑定到方法或属性get?,c#,.net,wpf,isenabled,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

我有一些控件,我需要根据一些计算结果隐藏或禁用这些控件。 我想将IsEnabled或IsVisible属性绑定到父窗体类的某个方法或属性get的结果。大概是这样的:

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding MyMethod}">
    <!--Some other stuff-->
</TabItem>
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;
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    double sumValue = (double)value;
    if(sumValue==2)
    {
        return true;
    }
    return false;
}
你能帮我找到一个合适的方法来实现这一点吗


Thx,JiKra

您可能需要使用多绑定:

<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>
对于
ValueB
,这将允许WPF在每次
ValueA
ValueB
更改时更新
绑定

您的转换器应如下所示:

<TabItem Name="MyTab" Header="This should be enabled when result is 2" IsEnabled="{Binding MyMethod}">
    <!--Some other stuff-->
</TabItem>
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;
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    double sumValue = (double)value;
    if(sumValue==2)
    {
        return true;
    }
    return false;
}
这将允许您在转换器中定义一个外部方法,每当ValueA或ValueB发生更改时,将再次调用该方法


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

您不能直接绑定到方法。它必须是一个财产。尽管如此,还有一些其他技巧可以绑定到问题中所示的方法

回到你的问题,我要做的是使我的方法成为一个属性

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

您需要创建一个新属性,该属性表示您在此处尝试实现的价值。这就是视图模型的全部用途。我强烈建议您避免在这里使用转换器,即使它可以工作。转换器应用于处理仅视图问题,而这是视图状态问题

潜在的视图模型如下所示:(我正在使用我的)

这似乎有点冗长,但我想强调以下几个原因:

  • 随着需求的变化,很容易找到和更改
    updateStabsEnabled
  • ValueA
    ValueB
    成为其他功能的组件时,很容易将钩子添加到它们受尊重的
    OnChanged
    方法中
  • 根据需要将
    IsTabEnabled
    绑定到
    IsEnabled
    Visibility
    很容易

值A和值B从何而来,何时重新计算?它们可以是当前类的全局变量,也可以分配一些外部计算器类-这无关紧要。我只需要将IsEnabled属性绑定到像这样的方法或类属性。我知道转换器。但我的问题是,是否可以将组件的IsEnabled(或任何)属性绑定到本地方法或类属性。valueA和valueB是不相关的,这只是一个例子。我是WPF的新手,请不要怪我。因此,您能否向我展示一种最简单的方法,如何将IsEnabled绑定到本地方法或类属性,例如真正的伪属性,如:public bool IsItEnabled(){return true;}?您通常可以绑定到属性。您可以执行以下操作:
public bool已启用{get{return true;}}}
,它很容易满足您的需要。WPF中绑定到方法的最佳实践是使用转换器(或上面的解决方法)。我相信有几种方法可以做到这一点,但我还没有研究过,因为转换器可以满足我的需要,并且更易于维护。这里列出了一些解决方法:如果您确实需要绑定到方法,最好在ViewModel中设置更新条件,而不是使用转换器。