2010-06-07 18 views
5

DataContext như Nguồn Chuyển đổi Binding Trong Tài

<Canvas.DataContext> 
    <ViewModels:VMSomeControl Model="{Binding RelativeSource={RelativeSource TemplatedParent}}" /> 
</Canvas.DataContext> 

<!-- DataContext is not passed into these Instances. 
     they also have no knowledge of their TemplatedParent. --> 
<Canvas.Resources> 

    <!-- is there a way to use a binding that points to the datacontext within the resources ? --> 
    <Converters:SomeConverter x:Key="someConverter" 
          SomeProperty="{Binding Path=Model.SomeProperty}" /> 

    <!-- is there a way to point Directly to the TemplatedParent ? --> 
    <Converters:SomeConverter x:Key="someConverter" 
          SomeProperty="{TemplateBinding SomeProperty}" /> 

</Canvas.Resources> 


<SomeFrameworkElement SomeProperty="{Binding Path=Model.SomeOtherProperty, Converter={StaticResource someConverter}, ConverterParameter=0}" /> 

<SomeFrameworkElement SomeProperty="{Binding Path=Model.SomeOtherProperty, Converter={StaticResource someConverter}, ConverterParameter=1}" /> 

</Canvas> 

là nó có thể sử dụng các ràng buộc có sử dụng một trong hai DataContext hoặc TemplatedParent Trong gốc Visuals resourecs một ControlTemplate ?

+0

vì một số lý do khiến luồng ngăn xếp cắt ngắn mẫu và mẫu điều khiển của tôi. Canvas này nằm ở gốc của mẫu kiểm soát. –

Trả lời

6

Nếu bạn muốn chuyển đổi giá trị của mình để có thể truy cập vào DataContext bạn có thể muốn sử dụng ConverterParameter thay vì:

<SomeFrameworkElement SomeProperty="{Binding Path=Model.SomeOtherProperty, Converter={StaticResource someConverter}, ConverterParameter={Binding DataContext}}" /> 

Các DataContext sau đó sẽ được chuyển sang cho chuyển đổi giá trị của mình như một tham số để thực hiện của bạn của IValueConverter.Convert.


Bạn có thể để vượt qua các thông số bindable để ValueConverter của bạn nếu bạn thực hiện IMultiValueConverter và ràng buộc các thông số bằng cách sử dụng lớp MultiBinding trong XAML:

<SomeFrameworkElement> 
    <SomeFrameworkElement.SomeProperty> 
     <MultiBinding Converter="{StaticResource someConverter}" > 
      <Binding Path="DataContext"/> 
     </MultiBinding>   
    </SomeFrameworkElement.SomeProperty> 
</SomeFrameworkElement> 

Các yếu tố ràng buộc của phần tử <MultiBinding> được thông qua theo phương pháp Convert của IMultiValueConverter làm thông số values. Convert có chữ ký sau:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture); 
+0

tiếc là bạn không thể sử dụng một ràng buộc trên "ConverterParameter" đó sẽ là thực sự tiện dụng mặc dù. –

+1

Bạn hoàn toàn đúng. Nhưng tôi nghĩ bạn có thể sử dụng mulitbinding cho việc này. Tôi đã cập nhật câu trả lời của mình cho phù hợp. –

+0

tôi chưa có cơ hội để kiểm tra điều này vì tôi đã làm việc trên một số dự án khác. nhưng tôi chắc chắn sẽ cung cấp cho bạn tín dụng nếu nó giải quyết được vấn đề của tôi. –

9

Câu trả lời trước là rất gần. nhưng các ràng buộc bên trong multibinding nên là:

<SomeFrameworkElement> 
    <SomeFrameworkElement.SomeProperty> 
     <MultiBinding Converter="{StaticResource someConverter}" > 
      <Binding /> 
     </MultiBinding>   
    </SomeFrameworkElement.SomeProperty> 
</SomeFrameworkElement> 

mà làm việc cho tôi

+0

Trong trường hợp của tôi ném một ngoại lệ "Hai chiều ràng buộc đòi hỏi đường dẫn hoặc XPath." Tôi đang ràng buộc tài sản văn bản của TextBox. – marbel82

1

Đây là một cách đơn giản và hiệu quả (mà làm việc cho ứng dụng của tôi):

<DataGrid.Columns> 
    <DataGridTextColumn Width="*" Header="ColumnHeader"> 
     <DataGridTextColumn.Binding> 
      <Binding Converter="{StaticResource YourConverterKey}" ConverterParameter="DataContext"/> 
     </DataGridTextColumn.Binding> 
    </DataGridTextColumn> 

Bây giờ bạn có thể sử dụng (giá trị) theo phương pháp Convertor làm DataContext của bạn.

Các vấn đề liên quan