2017-06-05 99 views
1

我有下面的按鈕,它的IsEnabled屬性綁定到ViewModel中的一個名爲EnableBtn的布爾。MVVM將IsEnabled綁定到ViewModel中的多個布爾值

如果我有另一個名爲EnableMail的布爾,我將如何修改這個以便IsEnabled綁定到兩者?

<Button IsEnabled="{Binding EnableBtn, Converter={StaticResource InvertBooleanConverter}}" x:Name="SaveSendButton" Grid.Row="0" Grid.Column="1" Text="{i18n:Translate SaveAndSend}" Style="{StaticResource bottomButtonsBlue}" Command="{Binding EmailPlanCommand}"></Button> 
+5

綁定到一個屬性,該屬性返回兩個bools的邏輯AND? – Stuart

+1

斯塔特所說的是正確的迴應.'EnableBtn'明確地涉及按鈕的啓用。所以如果需要的話,那個屬性的getter也應該考慮EnableMail的值。 – Skintkingle

+0

如果我正確地選擇了你,不需要多重綁定,只需綁定一個布爾值並評估get中的所有內容? – DarkW1nter

回答

5
public bool IsBothEnabled 
    { 
     get 
     { 
      if (EnableBtn && EnableMail) 
       return true; 
      return false; 
     } 
    } 

立即綁定Button.IsEnabled物業IsBothEnabled。

+2

請注意,如果其中一個屬性EnableBtn或EnableMail發生更改,則必須調用PropertyChanged(「IsBothEnabled」)。 – JanDotNet

+1

不要忘記'EnableBtn'和'EnableMail'的setter應該像往常一樣爲它們自己引發'PropertyChanged'事件,** AND **複合屬性'IsBothEnabled'。 –

+1

'返回EnableBtn && EnableMail'而不是'if'。 –

2

替代從毫克當量的有效的解決方案,你可以使用一個multi binding

的XAML代碼如下所示:

<Button.IsEnabled> 
    <MultiBinding Converter="{StaticResource AreAllTrueMultiValueConverter}"> 
     <Binding Path="EnableBtn" /> 
     <Binding Path="EnableMail" /> 
    </MultiBinding> 
</TextBox.IsEnabled> 

然而,你需要類似MultiValueConverter:

public class AreAllTrueMultiValueConverter: IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, 
      object parameter, System.Globalization.CultureInfo culture) 
    { 
     return values.OfType<bool>().All(); 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, 
      object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException("Cannot convert back"); 
    } 
} 

我更喜歡MultiBinding額外的視圖模型屬性,因爲它不需要「依賴屬性」,必須通知另一個屬性財產變了。因此它導致更簡單的視圖模型邏輯。

+2

如果你能展示一些XAML,我會贊成這個。不鼓勵「僅鏈接」答案。 –

+0

@JanDotNet請添加一些XAML。 –

+2

根據需要添加了代碼示例;) – JanDotNet

相關問題