2017-02-20 32 views
1

我有兩個布爾我想根據自己的值,顯示圖像,像這樣:WPF可視性綁定到布爾表達式多變量

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
</Window.Resources> 

<Image Visibility="{Binding (Boolean1 && Boolean2),Converter={StaticResource BooleanToVisibilityConverter}}" /> 

通知Boolean1和Boolean2表達。

+1

綁定路徑不支持這種類型的表達式,在視圖模型中創建'get'-only屬性'pu blic bool Boolean3 {get {return Boolean1 && Boolean2; }}'並綁定到布爾值3 – ASh

+0

必須有一個簡單的方法來執行類似內聯的操作? – Stacker

+0

您需要使用多重綁定和多值轉換器http://www.codearsenal.net/2013/12/wpf-multibinding-example.html#.WKrPW_LNjMM – MikeT

回答

7

有一個在XAML中沒有定義&&操作,但你可以結合幾個屬性和使用IMultiValueConverter

<Image> 
    <Image.Visibility> 
     <MultiBinding Converter="{StaticResource YourMultiConverter}"> 
      <Binding Path="Boolean1" /> 
      <Binding Path="Boolean2" /> 
     </MultiBinding> 
    </Image.Visibility> 
</Image> 

public class YourMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool a = (bool)values[0]; 
     bool b = (bool)values[1]; 

     return a && b ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

或者你可以使用一個Image風格與條件:

<Image> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Boolean1}" Value="True" /> 
         <Condition Binding="{Binding Boolean2}" Value="True" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Visibility" Value="Visible" /> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 
+0

對不起傻問題如何定義({StaticResource YourMultiConverter})? – Stacker

+0

@Stacker與您定義任何轉換器相同的方式將其創建爲相關資源字典中的靜態資源,只需記住您需要定義名稱空間(如果您尚未定義) – MikeT

+1

in < Window.Resources>。 – mm8

0

您可以使用多值轉換器來解決此問題

XAML:

<TextBlock Name="textBlockOutput" Grid.Row="4" Grid.Column="2"> 
     <TextBlock.Text> 
      <MultiBinding Converter="{StaticResource MultiValueConverter}"> 
       <Binding Path="TextOne" /> 
       <Binding Path="TextTwo" /> 
       <Binding Path="TextThree" /> 
      </MultiBinding> 
     </TextBlock.Text> 
    </TextBlock> 




public class MultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     string one = values[0] as string; 
     string two = values[1] as string; 
     string three = values[2] as string; 
     if(!string.IsNullOrEmpty(one) && !string.IsNullOrEmpty(two) && !string.IsNullOrEmpty(three)) 
     { 
      return one + two + three; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

雖然你的答案是正確的更好的解釋,爲什麼這修復它會改善這個答案 – MikeT

0

MM8提供了正確的答案卻略有改善將是這個

public class LogicalAndConverter : IMultiValueConverter 
{ 
    public IValueConverter FinalConverter{get;set;} 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool rtn = values.All(v=>(bool)v); 

     if(FinalConverter==null)  
      return rtn; 
     else 
      FinalConverter.Convert(rtn,targetType,parameter,culture); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

這然後允許你使用與出不同的轉換器重寫式多

<local:LogicalAndConverter x:Key="LogicalAndConverter "> 
    <local:LogicalAndConverter.FinalConverter> 
     <BooleanToVisibilityConverter /> 
    </local:LogicalAndConverter.FinalConverter> 
</local:LogicalAndConverter>