2011-05-20 1 views
7

J'affiche les résultats de plusieurs tests. Il y a 2 variables sur chaque test, et le texte et la couleur des résultats affichés varient avec les deux. Cela fonctionne, mais il y a beaucoup de MultiBinding répétitif, et j'aimerais voir s'il existe un moyen d'utiliser un Style pour simplifier le XAML.Utiliser un style WPF pour simplifier les liaisons multiples répétitives

Voici un aperçu simplifié à ce que mon code ressemble à:

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

Je voudrais définir un style pour que je puisse appliquer les MultiBindings aux TextBlocks plus facilement. La seule différence dans chacun est le test que je spécifie dans les valeurs du chemin de liaison. Mon objectif serait quelque chose comme:

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

Est-ce quelque chose de semblable à ce possible?

Répondre

12

Vous pouvez faire quelque chose comme ceci:

<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}" /> 

Ici vous passez dans le « test » comme le contexte de liaison par défaut, qui est utilisé par le style.

+0

C'est parfait! Cela fonctionne comme annoncé. Je soupçonnais que j'avais besoin de regarder le DataContext, mais je n'arrivais pas à comprendre comment le mettre avec la liaison supplémentaire. Merci!! – jwismar

Questions connexes