10

いくつかのテストの結果を表示しています。各テストには2つの変数があり、表示される結果のテキストと色は両方によって異なります。私はこれを機能させていますが、繰り返しマルチバインディングが行われているので、スタイルを使用してXAMLを単純化する方法があるかどうかを確認したいと思います。

これが私のコードがどのように見えるかを簡単に示したものです:

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

MultiBindingsをTextBlockに簡単に適用できるように、スタイルを定義したいと思います。それぞれの唯一の違いは、バインディングパスの値で指定するテストです。私の目標は次のようになります。

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

これに似たものはありますか?

4

1 に答える 1

18

あなたはこのようなことをすることができます:

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

ここでは、スタイルで使用されるデフォルトのバインディングコンテキストとして「テスト」を渡します。

于 2011-05-20T22:02:41.837 に答える