2011-06-28 10 views
30

Tôi có hai bộ chuyển đổi riêng biệt để hiển thị, một dựa trên việc liệu một trường đã được cập nhật và một trường dựa trên việc một trường có được phép nhìn thấy hay không. Tôi sử dụng một cập nhật cho một mục văn bản trên trang của tôi sao cho một ngôi sao xuất hiện bên cạnh một trường được cập nhật. Nhưng một số mục văn bản chỉ hiển thị với một số người dùng dựa trên cấp độ quyền.Làm thế nào để boolean && hai chuyển đổi tầm nhìn

Ví dụ:

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

<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}}" /> 

Vấn đề của tôi là đối với trường hợp các lĩnh vực cho phép bắt buộc của tôi cần phải chạy cả hai bộ chuyển đổi để xác định xem các ngôi sao xuất hiện. Có cách nào để làm một boolean "Và" trên kết quả của hai chuyển đổi?

Tôi đã xem this post nhưng dường như không cho phép các bộ tham số khác nhau được chuyển vào hai trình biến đổi khác nhau.

Cập nhật ------- --------

Tôi cũng đã cố gắng để tạo ra một MultiValueConverter với XAML này

<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> 

Nhưng khi nó xâm nhập vào bộ chuyển đổi cả hai giá trị là "DependencyProperty.UnsetValue". Vì vậy, tôi đang làm điều gì đó sai ở đây.

-------- Giải pháp ---------

Tôi phải sửa đổi điều này, nhưng sau đó nó hoạt động.

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

Trả lời

53

Bạn có thể sử dụng MultiBinding cùng với IMultiValueConverter ngắn, được làm bằng tay.

Ví dụ:

<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> 

... và bộ chuyển đổi ...

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

Tôi đã thử rằng không có may mắn, hãy xem phần cập nhật ở trên – Bill

+1

@Psiclopz: Tôi đã đưa ra một ví dụ.Điều này hoạt động trên máy MY =) Trường hợp của bạn có vẻ phức tạp hơn thế, nhưng có lẽ nó sẽ giúp ích. – Jens

+0

Nó gần như làm việc cho tôi, nhưng như bạn đã nói, trường hợp của tôi phức tạp hơn một chút. Tôi đã đăng giải pháp của mình ở trên. Cảm ơn bạn đã giúp đỡ. – Bill

3

Một điều mà đến tâm trí là, có lẽ, thay vì hai lĩnh vực khác nhau boolean, một chút trường duy nhất được tạo ra bởi ORing cùng updatedField và allowedField. Sau đó, bạn có thể có ba bộ chuyển đổi giá trị, tất cả đều hoạt động trên cùng một trường.

Hoặc chỉ tính toán một trường khác trong mô hình dữ liệu của bạn thực hiện ANDING ở đó. Đó có lẽ là hiệu quả hơn (về thời gian chạy).

+0

Bạn có thể cung cấp thêm chi tiết về điều này không? Tôi không hiểu làm thế nào bạn sẽ làm điều đó trong xaml. – Bill

+1

Bạn không làm điều đó ở tất cả trong xaml. –

0

Bạn có thể vượt qua một mảng của hai đối tượng để chuyển đổi trong ConverterParameter - xây dựng mảng trong XAML.

+0

làm thế nào để vượt qua hai đối tượng trong converterparameter trong xaml? Tôi thích biết rằng ... – Sam

15

Đến bữa tiệc ở đây nhưng một giải pháp dễ dàng hơn là chỉ quấn điều khiển trong một điều khiển khác. Tôi thích điều này để có rất nhiều Converters làm những việc khác nhau.

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

Briliant! Không cần phải viết thêm lớp cho một điều đơn giản như vậy! – TheBoyan

+2

Từ WPF trò chuyện - sự đồng thuận là biên giới là cách rẻ nhất để làm một cái gì đó như thế này (thay vì một StackPanel). –

+0

Tôi đã cố gắng chỉnh sửa để giúp mọi người nhưng nó đã bị từ chối bởi vì mọi người trên trang web này là ngu ngốc – Asheh