2011-05-20 21 views
7

Estoy mostrando los resultados de varias pruebas. Hay 2 variables en cada prueba, y el texto y el color de los resultados mostrados varían con ambos. Tengo esto funcionando, pero hay un montón de MultiBinding repetitivo y me gustaría ver si hay una forma de usar un Estilo para simplificar el XAML.Use un estilo WPF para simplificar los enlaces múltiples repetitivos

He aquí un vistazo simplificado en lo que mi código es el siguiente:

//TestResults.cs excerpt 
public class TestResults 
{ 
    private Test1Result test1 = new Test1Result(); 
    public Test1Result Test1 { get { return test1; } } 

    private Test2Result test2 = new Test2Result(); 
    public Test2Result Test2 { get { return test2; } } 
} 

//TestCtrl.xaml.cs excerpt 
public class TestCtrl : UserControl 
{ 
    private TestResults results = new TestResults(); 
    public TestResults Results { get { return results; } } 
} 
<!-- TestCtrl.xaml excerpt --> 
<UserControl x:Class="Tester.TestCtrl" x:Name="TestResultsCtrl" ...> 

<!-- lots of stuff --> 

<TextBlock Grid.Row="6"> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource TestToTextConverter}" > 
      <Binding Path="Results.Test1.Temperature" ElementName="TestResultsCtrl" /> 
      <Binding Path="Results.Test1.Time" ElementName="TestResultsCtrl" /> 
     </MultiBinding> 
    </TextBlock.Text> 
    <TextBlock.Foreground> 
     <MultiBinding Converter="{StaticResource TestToBrushConverter}"> 
      <Binding Path="Results.Test1.Temperature" ElementName="TestResultsCtrl" /> 
      <Binding Path="Results.Test1.Time" ElementName="TestResultsCtrl" /> 
     </MultiBinding> 
    </TextBlock.Foreground> 
</TextBlock> 

<TextBlock Grid.Row="7"> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource TestToTextConverter}" > 
      <Binding Path="Results.Test2.Temperature" ElementName="TestResultsCtrl" /> 
      <Binding Path="Results.Test2.Time" ElementName="TestResultsCtrl" /> 
     </MultiBinding> 
    </TextBlock.Text> 
    <TextBlock.Foreground> 
     <MultiBinding Converter="{StaticResource TestToBrushConverter}"> 
      <Binding Path="Results.Test2.Temperature" ElementName="TestResultsCtrl" /> 
      <Binding Path="Results.Test2.Time" ElementName="TestResultsCtrl" /> 
     </MultiBinding> 
    </TextBlock.Foreground> 
</TextBlock> 

<!-- lots more repetitions here --> 

me gustaría definir un estilo para que pueda aplicar las MultiBindings a los TextBlocks más fácilmente. La única diferencia en cada uno es la prueba que especifico en los valores de ruta de enlace. Mi objetivo sería algo así como:

<Style x:Key="TestResultsStyle" TargetType="{x:Type TextBlock}"> 
    <!-- do binding stuff here --> 
</Style> 

<TextBlock Grid.Row="6" 
    Style="{StaticResource TestResultsStyle}" <!--set Test1 path here --> /> 
<TextBlock Grid.Row="7" 
    Style="{StaticResource TestResultsStyle}" <!--set Test2 path here --> /> 

Es algo similar a esto posible?

Respuesta

12

se podría hacer algo como esto:

<Style x:Key="TestResultsStyle" TargetType="{x:Type TextBlock}"> 
    <Setter Property="Text"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource TestToTextConverter}" > 
       <Binding Path="Temperature" /> 
       <Binding Path="Time" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
    <!-- Same for Foreground --> 
</Style> 

<TextBlock Grid.Row="6" 
    DataContext="{Binding ElementName=TestResultsCtrl, Path=Results.Test1}" 
    Style="{StaticResource TestResultsStyle}" /> 
<TextBlock Grid.Row="7" 
    DataContext="{Binding ElementName=TestResultsCtrl, Path=Results.Test2}" 
    Style="{StaticResource TestResultsStyle}" /> 

Aquí se pasa en la "Prueba" como el contexto de encuadernado predeterminada, que es utilizado por el estilo.

+0

¡Eso es perfecto! Funciona como se anuncia. Sospechaba que necesitaba mirar el DataContext, pero no pude encontrar la manera de unirlo con el Enlace adicional. ¡¡Gracias!! – jwismar

Cuestiones relacionadas