2012-06-06 40 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中的更新條件而不是轉換器的好處。 –

相關問題