DataContext как источник для привязки конвертера в ресурсах - PullRequest
5 голосов
/ 07 июня 2010

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

возможно ли использовать привязки, которые используют dataContext или TemplatedParent В пределах корневых визуальных образов ControlTemplate?

Ответы [ 3 ]

9 голосов
/ 04 марта 2011

Предыдущий ответ действительно очень близок. но связывание внутри мультисвязывания должно быть:

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

, который работал для меня

6 голосов
/ 07 июня 2010

Если вы хотите, чтобы ваш преобразователь значений имел доступ к текстовому тексту данных, вы можете использовать вместо него ConverterParameter:

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

Затем этот текстовый текст будет передан в ваш преобразователь значений в качестве параметра.к вашей реализации IValueConverter.Convert .


Вы можете передавать привязываемые параметры в ваш преобразователь значений, если вы реализуете IMultiValueConverter и привязываетепараметры, использующие класс MultiBinding в XAML:

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

Элементы привязки элемента <MultiBinding> передаются методу Convert для IMultiValueConverter в качестве параметра values,Convert имеет следующую подпись:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture);
1 голос
/ 26 октября 2014

Вот простой и эффективный способ (который работает для моего приложения):

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

Теперь вы можете использовать (значение) в методе Convertor в качестве DataContext.

...