2013-03-09 26 views
112

Có cách nào tôi có thể làm điều này trong một Style:Binding ConverterParameter

<Style TargetType="FrameworkElement"> 
    <Setter Property="Visibility"> 
     <Setter.Value> 
      <Binding Path="Tag" 
       RelativeSource="{RelativeSource AncestorType=UserControl}" 
       Converter="{StaticResource AccessLevelToVisibilityConverter}" 
       ConverterParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" />       
     </Setter.Value> 
    </Setter> 
</Style> 

Tôi chỉ cần gửi Tag của top-level phụ huynh và các Tag kiểm soát bản thân đến lớp chuyển đổi của tôi.

Trả lời

227

Thuộc tính ConverterParameter không thể bị ràng buộc vì nó không phải là thuộc tính phụ thuộc.

Binding không được bắt nguồn từ DependencyObject, không có thuộc tính nào của nó có thể là thuộc tính phụ thuộc. Kết quả là, một ràng buộc không bao giờ có thể là đối tượng mục tiêu của một ràng buộc khác.

Tuy nhiên, có một giải pháp thay thế. Bạn có thể sử dụng một MultiBinding với một multi-value converter thay vì một Binding bình thường:

<Style TargetType="FrameworkElement"> 
    <Setter Property="Visibility"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource AccessLevelToVisibilityConverter}"> 
       <Binding Path="Tag" RelativeSource="{RelativeSource Mode=FindAncestor, 
                AncestorType=UserControl}"/> 
       <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}"/> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 

Bộ chuyển đổi đa giá trị được một mảng các giá trị nguồn như đầu vào:

public class AccessLevelToVisibilityConverter : IMultiValueConverter 
{ 
    public object Convert(
     object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values.All(v => (v is bool && (bool)v)) 
      ? Visibility.Visible 
      : Visibility.Hidden; 
    } 

    public object[] ConvertBack(
     object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
29

Không, không may này sẽ không thực hiện được vì ConverterParameter không phải là một DependencyProperty vì vậy bạn sẽ không thể sử dụng các ràng buộc

Nhưng có lẽ bạn có thể gian lận và sử dụng một MultiBinding với IMultiValueConverter để vượt qua trong vòng 2 Tag tính .