2011-06-28 12 views
30

Mam dwa oddzielne konwertery dla widoczności, jeden na podstawie tego, czy pole zostało zaktualizowane i jeden na podstawie tego, czy pole może być widoczne. Używam updatedField jeden dla każdego elementu tekstowego na mojej stronie, aby gwiazda pojawiła się obok zaktualizowanego pola. Ale niektóre elementy tekstowe są widoczne tylko dla niektórych użytkowników na podstawie poziomów uprawnień.Jak przekonwertować boolean && dwa konwertery widzialności

Na przykład:

<Image Visibility="{Binding ElementName=MyObject, Path=UpdatedFields, Mode=OneWay, Converter={StaticResource updatedFieldConverter}, ConverterParameter=FieldToTest}" Source="Properties:Resources.star_yellow" /> 

i

<TextBlock FontSize="21" Foreground="{DynamicResource LabelBrush}" Text="{x:Static Properties:Resources.Some_Text}" Visibility="{Binding Source={StaticResource allowedFields}, Path=Some_Text_Field, Converter={StaticResource visibilityConverter}}" /> 

Moim problemem jest to, że w przypadku pól przyzwoleniem wymagane muszę uruchomić oba konwertery do ustalenia, czy pojawia się gwiazda. Czy istnieje sposób na zrobienie boolowskiego "I" na wynikach dwóch konwerterów?

Spojrzałem na this post, ale wydaje się, że nie pozwala to na przekazywanie różnych zestawów parametrów do dwóch różnych konwerterów.

Aktualizacja ------- --------

Próbowałem też stworzyć MultiValueConverter z tym XAML

<Image Grid.Row="4" Grid.Column="0" Source="star_yellow.png"> 
    <Image.Visibility> 
     <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest" > 
     <Binding ElementName="allowedFieldsModel" Path="Some_Text_Field" Mode="OneWay" />       
     <Binding ElementName="MyObject" Path="UpdatedFields" Mode="OneWay" /> 
     </MultiBinding> 
    </Image.Visibility> 
</Image> 

Ale kiedy wchodzi do konwertera obie wartości są "DependencyProperty.UnsetValue". Więc najwyraźniej robię coś złego tutaj.

-------- Rozwiązanie ---------

musiałem zmodyfikować do tego, ale to działało.

<Image.Visibility> 
    <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest"> 
     <Binding Source="{StaticResource allowedFieldsModel}" Path="Some_Text_Field" /> 
     <Binding Path="MyObject.UpdatedFields" /> 
    </MultiBinding> 
</Image.Visibility> 

Odpowiedz

53

Można użyć funkcji MultiBinding wraz z krótkim, ręcznym edytorem IMultiValueConverter.

Przykład:

<StackPanel> 
    <StackPanel.Resources> 
     <local:MultiBooleanToVisibilityConverter x:Key="Converter" /> 
    </StackPanel.Resources> 
    <CheckBox x:Name="Box1" /> 
    <CheckBox x:Name="Box2" /> 
    <TextBlock Text="Hidden Text"> 
     <TextBlock.Visibility> 
      <MultiBinding Converter="{StaticResource Converter}"> 
       <Binding ElementName="Box1" 
          Path="IsChecked" /> 
       <Binding ElementName="Box2" 
          Path="IsChecked" /> 
      </MultiBinding> 
     </TextBlock.Visibility> 
    </TextBlock>     
</StackPanel> 

... i konwerter ...

class MultiBooleanToVisibilityConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     bool visible = true; 
     foreach (object value in values) 
      if (value is bool) 
       visible = visible && (bool)value; 

     if (visible) 
      return System.Windows.Visibility.Visible; 
     else 
      return System.Windows.Visibility.Hidden; 
    } 

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

Próbowałem tego bez powodzenia, patrz wyżej aktualizacja – Bill

+1

@Psiclopz: Podałem przykład.Działa to na MOJEJ maszynie =) Twoja sprawa wydaje się być bardziej skomplikowana, ale może pomaga. – Jens

+0

To prawie dla mnie zadziałało, ale jak powiedziałeś, moja sprawa była nieco bardziej skomplikowana. Napisałem moje rozwiązanie powyżej. Dzięki za pomoc. – Bill

3

Jedną rzeczą, która przyszła do głowy to, być może, zamiast dwóch różnych polach logicznych, pojedynczy bit pola utworzonego przez Oring razem updatedField i allowedField. Wtedy możesz mieć trzy konwertery wartości, wszystkie działające na tym samym polu.

Albo po prostu obliczyć inne pole w swoim modelu danych, który wykonuje tam ORAZ. To prawdopodobnie bardziej wydajne (pod względem czasu wykonywania).

+0

Czy możesz podać więcej szczegółów na ten temat? Nie rozumiem, jak byś to zrobił w Xaml. – Bill

+1

Nie robisz tego w ogóle w Xaml. –

0

Można by przekazać tablicę dwóch obiektów do konwertera w ConverterParameter - konstruowaniu tablicę w XAML.

+0

jak przekazać dwa obiekty w parametrze converterparametr w xaml? Uwielbiam wiedzieć, że ... – Sam

15

Późnym przyjęciem tutaj, ale łatwiejszym rozwiązaniem jest po prostu zapakowanie kontrolki w inną kontrolkę. Wolę to od posiadania wielu konwerterów, które robią różne rzeczy.

<StackPanel Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}"> 
<ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/> 
</StackPanel> 
+1

Briliant! Nie ma potrzeby pisania dodatkowej lekcji na tak prostą rzecz! – TheBoyan

+2

Z czatu WPF - wynika, że ​​granice to najtańszy sposób na zrobienie czegoś takiego (zamiast StackPanel). –

+0

Próbowałem to edytować, aby pomóc wszystkim, ale zostało odrzucone, ponieważ ludzie na tej stronie są głupi – Asheh