2010-06-07 7 views
5

DataContext como fuente para el convertidor de unión dentro de los recursos

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

es posible el uso de enlaces que utilizan ya sea el DataContext o la TemplatedParent Dentro Visuales raíz resourecs de un ControlTemplate ?

+0

por alguna razón stackoverflow truncó mi plantilla de estilo y control. este lienzo está en la raíz de la plantilla de control. –

Respuesta

6

Si desea que su convertidor de valores para poder acceder a la DataContext es posible que desee utilizar ConverterParameter lugar:

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

El DataContext a continuación, se pasará a su convertidor de valores como un parámetro para su ejecución de IValueConverter.Convert.


Es posible que pueda pasar parámetros que pueden vincularse a su valueconverter si implementa IMultiValueConverter y enlazar los parámetros utilizando la clase MultiBinding en XAML: se pasan

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

Los elementos de unión del elemento de <MultiBinding> al método Convert de IMultiValueConverter como el parámetro values. Convert tiene la siguiente firma:

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

desafortunadamente no se puede usar un enlace en "ConvertidorParámetro" que sin embargo sería REALMENTE útil. –

+1

Por supuesto, tiene toda la razón. Pero creo que puedes usar mulitbinding para esto. Actualicé mi respuesta en consecuencia. –

+0

aún no he tenido la oportunidad de probar esto ya que he estado trabajando en algunos otros proyectos. pero me aseguraré de darle crédito si resuelve mi problema. –

9

respuesta anterior es reeeeally muy cerca. pero la unión dentro de la unión múltiple debe ser:

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

que trabajó para mí

+0

En mi caso arroja una excepción "El enlace bidireccional requiere Path o XPath". Estoy vinculando la propiedad Text de TextBox. – marbel82

1

Aquí está una manera sencilla y eficaz (que funciona para mi aplicación):

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

Ahora puede utilizar (valor) en el método Convertor como su DataContext.

Cuestiones relacionadas