2010-06-07 7 views
5

DataContext come riferimento per il convertitore vincolante entro Risorse

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

è possibile utilizzare attacchi che utilizzano sia il DataContext o TemplatedParent All'interno Visuals Root resourecs di un ControlTemplate ?

+0

per qualche motivo StackOverflow ha troncato il mio modello di stile e controllo. questa tela è nella radice del modello di controllo. –

risposta

6

Se si desidera che il convertitore di valori per essere in grado di accedere al DataContext si consiglia di utilizzare ConverterParameter invece:

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

il DataContext sarà poi trasmesso al convertitore di valori come parametro per l'implementazione di IValueConverter.Convert.


Si può essere in grado di passare i parametri associabili al ValueConverter se si implementa IMultiValueConverter e associare i parametri utilizzando la classe MultiBinding in XAML: sono passati

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

Gli elementi vincolanti del elemento <MultiBinding> al metodo Convert di IMultiValueConverter come parametro values. Convert ha la seguente firma:

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

sfortunatamente non è possibile utilizzare un'associazione su "ConverterParameter" che sarebbe DAVVERO utile. –

+1

Ovviamente hai assolutamente ragione. Ma penso che potresti essere in grado di usare Mulitbinding per questo. Ho aggiornato la mia risposta di conseguenza. –

+0

Non ho ancora avuto la possibilità di testare questo come ho lavorato su altri progetti. ma sarò sicuro di darti credito se risolve il mio problema. –

9

risposta precedente è reeeeally davvero vicino. ma il legame all'interno della MultiBinding dovrebbe essere:

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

che ha funzionato per me

+0

Nel mio caso genera un'eccezione "Il bind a due vie richiede Path o XPath.". Sono vincolante proprietà Text di TextBox. – marbel82

1

Ecco un modo semplice ed efficace (che funziona per la mia app):

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

Ora è possibile utilizzare (valore) nel metodo Convertor come DataContext.

Problemi correlati