6 Stimmen

DataContext als Quelle für Konverterbindungen innerhalb von 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 den dataContext oder den TemplatedParent verwenden innerhalb der Root-Visuals-Ressourcen eines ControlTemplates verwenden?

11voto

Martín Coll Punkte 2883

Die vorherige Antwort ist wirklich sehr nahe dran, aber die Bindung innerhalb der Multibindung sollte sein:

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

das bei mir funktioniert hat

6voto

Jakob Christensen Punkte 14531

Wenn Sie möchten, dass Ihr Wertkonverter auf den Datenkontext zugreifen kann, sollten Sie stattdessen ConverterParameter verwenden:

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

Der Datenkontext wird dann an den Wertekonverter als Parameter für die Implementierung von IValueConverter.Convert .


Sie können möglicherweise bindbare Parameter an Ihren Wertkonverter übergeben, wenn Sie die IMultiValueConverter und binden die Parameter mit der MultiBinding Klasse in XAML:

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

Die verbindlichen Elemente des <MultiBinding> Element werden an das Convert Methode der IMultiValueConverter als die values Parameter. Convert hat die folgende Signatur:

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

1voto

SomeProperty="{Binding . ,Converter={StaticResource SomeConverter}, ConverterParameter=someParam}"

Der Punkt zeigt an, dass Sie an einen Datentext binden

-3voto

Matrix Punkte 115

Hier ist eine einfache und effiziente Methode (die für meine Anwendung funktioniert):

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X