2017-02-20 12 views
1

У меня есть две булевы Я хочу показать изображение в зависимости от их стоимости, что-то вроде этого:WPF Visiblity Связывание с булевой выражения с несколькими переменными

<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; }} 'и привязка к Boolean3 – 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(); 
    } 
} 

это то позволяет сделать использовать различные преобразователи с амбулаторным переписыванием multiconverter

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