2010-06-07 7 views
5

DataContext как источник для преобразователя Связывание В ресурсов

<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 В Корневые визуалы resourecs ControlTemplate в ?

+0

почему-то stackoverflow урезал мой стиль и шаблон управления. Этот холст находится в корне шаблона управления. –

ответ

6

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

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

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


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

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

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

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

К сожалению, вы не можете использовать привязку к «ConverterParameter» , которая была бы ДЕЙСТВИТЕЛЬНО удобна. –

+1

Вы, конечно, абсолютно правы. Но я думаю, что вы можете использовать mulitbinding для этого. Я обновил свой ответ соответственно. –

+0

У меня еще не было возможности проверить это, поскольку я работал над некоторыми другими проектами. но я обязательно буду вам благодарен, если он решит мою проблему. –

9

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

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

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

+0

В моем случае выбрасывается исключение «Двухсторонняя привязка требует Path или XPath.». Я привязываю текстовое свойство TextBox. – marbel82

1

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^