2010-06-07 5 views
5

Datacontext als Quelle für Converter Bindung Innerhalb Ressourcen

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

ist es möglich, Bindungen zu verwenden, die entweder die Datacontext oder die TemplatedParent Innerhalb einer Control Root Visuals resourecs verwenden ?

+0

aus irgendeinem Grund stackoverflow meine Stil und Steuerelement Vorlage abgeschnitten. Dieses Canvas befindet sich im Stamm der Steuerelementvorlage. –

Antwort

6

Wenn Sie Ihren Werteumwandler wollen die Datacontext zugreifen zu können, sollten Sie Converter stattdessen verwenden:

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

Die Datacontext wird dann als Parameter für die Implementierung auf Ihre Wertwandler weitergegeben werden von IValueConverter.Convert.


Unter Umständen können Sie bindable Parameter Ihren Valueconverter zu übergeben, wenn Sie IMultiValueConverter implementieren und die Parameter binden die MultiBinding Klasse in XAML:

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

Die Bindungselemente des <MultiBinding> Element übergeben werden zu der Convert Methode von IMultiValueConverter als der values Parameter. Convert hat die folgende Signatur:

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

Leider können Sie keine Bindung für "ConverterParameter" verwenden, die wirklich nützlich wäre. –

+1

Sie haben natürlich absolut Recht. Aber ich denke, dass Sie in der Lage sein können, Multibinding dafür zu verwenden. Ich habe meine Antwort entsprechend aktualisiert. –

+0

Ich hatte noch keine Gelegenheit das zu testen, da ich an anderen Projekten gearbeitet habe. aber ich werde sicher sein, Ihnen Kredit zu geben, wenn es mein Problem löst. –

9

Zurück Antwort reeeeally ganz in der Nähe ist. aber innerhalb des mehrbindigen sollte die Bindung sein:

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

die für mich gearbeitet

+0

In meinem Fall löst eine Ausnahme "Zwei-Wege-Bindung erfordert Path oder XPath.". Ich bin bind Text-Eigenschaft von TextBox. – marbel82

1

Hier ist eine einfache und effiziente Art und Weise (die für meine App funktioniert):

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

Jetzt können Sie verwenden (Wert) in der Convertor Methode als Ihre DataContext.