2010-06-07 18 views
5

DataContext jako źródło dla Converter Oprawa ciągu Zasobów

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

jest możliwe wykorzystanie powiązań, które korzystają zarówno DataContext lub TemplatedParent obrębie ControlTemplate za wizualizacje korzeniowe resourecs ?

+0

z jakiegoś powodu stackoverflow skrócił mój styl i szablon kontroli. To płótno znajduje się w katalogu głównym szablonu sterowania. –

Odpowiedz

6

Jeśli chcesz, aby konwerter wartość, aby móc uzyskać dostęp do datacontext może chcesz używać ConverterParameter zamiast:

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

DataContext zostaną następnie przekazane do konwertera wartość jako parametr do implementacji z IValueConverter.Convert.


Możesz być w stanie przekazać parametry Bindable do valueconverter jeśli wdrożenie IMultiValueConverter i wiążą parametry przy użyciu klasy MultiBinding w XAML:

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

Wiążące elementy elementu <MultiBinding> są przekazywane do metody Convert jako parametru values. Convert ma następujący podpis:

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

Niestety nie można użyć wiązania w "ConverterParameter" , które byłoby NAPRAWDĘ poręczne. –

+1

Masz oczywiście absolutną rację. Ale myślę, że możesz użyć do tego mulitbinding. Odpowiednio zaktualizowałem swoją odpowiedź. –

+0

Nie miałem jeszcze okazji przetestować tego, ponieważ pracowałem nad kilkoma innymi projektami. ale na pewno dam ci kredyt, jeśli rozwiąże mój problem. –

9

Poprzednia odpowiedź jest reeeeally naprawdę blisko. ale wiązanie wewnątrz MultiBinding powinno być:

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

że pracował dla mnie

+0

W moim przypadku zgłasza wyjątek "Wiązanie dwukierunkowe wymaga ścieżki lub XPath.". Wiążę Właściwość Text z TextBox. – marbel82

1

Oto prosty i skuteczny sposób (który pracuje dla mojej aplikacji):

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

Teraz można użyć (wartość) w metodzie Convertor jako DataContext.

Powiązane problemy