2012-06-06 54 views
2

我有一些控制,我需要根据一些计算结果隐藏或禁用。 我想将IsEnabled或IsVisible属性绑定到父窗体类的某个方法或属性获取的结果。事情是这样的:如何将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; 
} 

你能帮我找到一种合适的方式来实现这一点,好吗?

THX,JiKra

+0

_valueA和_valueB从何而来,何时应该重新计算? –

+0

它们可以是当前类的全局变量,也可以是一些外部计算器类的分配 - 这并不重要。我只需要将IsEnabled属性绑定到像这样的方法或类属性。 – JiKra

回答

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> 

在您的视图模型,您应该具备以下(假设你的视图模型实现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; 
} 

这将让你有转换器中,这将再次每隔值a或VALUEB时间会改变被称为定义一个外部方法。

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

+0

好的,这真是太好了。我知道转换器。但问题的关键是,是否可以将组件的IsEnabled(或任何)属性绑定到本地方法或类属性。 valueA和valueB是无关紧要的,它只是一个例子。我是WPF的新手,请不要责怪我。那么你能否告诉我一个最简单的方法,如何将IsEnabled绑定到本地方法或类属性,例如真正的虚拟道具如:public bool IsItEnabled(){return true; }? – JiKra

+0

您通常可以绑定到属性。你可以做的是以下几点: 'public bool IsIsEnabled {get {return true; }}'它很容易适合你的需要。 WPF中绑定方法的好习惯是使用转换器(或上面的解决方法)。我相信有几种方法可以做到这一点,但我没有看过它,因为转换器做我所需要的并且更容易维护 – Damascus

+0

一些变通办法在这里列出:http://stackoverflow.com/questions/502250/bind-如果你真的需要绑定到一个方法 – Damascus

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; 
} 
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成为其他功能的组件,很容易将挂钩添加到其尊重的方法中。
  • 根据需要很容易将IsTabEnabled绑定到IsEnabledVisibility
+0

有关ViewModel中的更新条件而不是转换器的好处。 –

相关问题