2010-06-07 14 views
5

DataContext comme source Convertisseur de liaison avec les ressources

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

est-il possible d'utiliser les liaisons qui utilisent soit le DataContext ou TemplatedParent Dans un Visuals racine de ControlTemplate de resourecs ?

+0

pour une raison quelconque, stackoverflow a tronqué mon style et mon modèle de contrôle. ce canevas est à la racine du modèle de contrôle. –

Répondre

6

Si vous voulez que votre convertisseur de valeur pour pouvoir accéder au datacontext vous pouvez utiliser ConverterParameter à la place:

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

Le datacontext sera ensuite transmis à votre convertisseur de valeur en tant que paramètre à votre mise en œuvre de IValueConverter.Convert.


Vous pourriez être en mesure de passer des paramètres pouvant être liées à votre valueconverter si vous implémentez IMultiValueConverter et lier les paramètres en utilisant la classe MultiBinding en XAML:

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

Les éléments de fixation de l'élément <MultiBinding> sont passés à la méthode Convert de IMultiValueConverter en tant que paramètre values. Convert a la signature suivante:

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

malheureusement, vous ne pouvez pas utiliser une liaison sur "ConverterParameter" qui serait vraiment pratique si. –

+1

Vous avez bien sûr raison. Mais je pense que vous pourriez être en mesure d'utiliser mulitbinding pour cela. J'ai mis à jour ma réponse en conséquence. –

+0

Je n'ai pas encore eu l'occasion de le tester car j'ai travaillé sur d'autres projets. mais je serai sûr de vous donner du crédit si cela résout mon problème. –

9

Réponse précédente est reeeeally vraiment proche. mais la liaison à l'intérieur du MultiBinding doit être:

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

qui a travaillé pour moi

+0

Dans mon cas, lève une exception "Liaison bidirectionnelle nécessite Path ou XPath.". Je lie la propriété Text de TextBox. – marbel82

1

Voici un moyen simple et efficace (qui fonctionne pour mon application):

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

vous pouvez utiliser (valeur) dans la méthode Convertor en tant que DataContext.