0

いくつかのボタンを表示する ItemsControl コントロールがあります。ボタンの 1 つをクリックすると、選択したリソース (ボタンにバインドされている) の詳細を表示する必要があります。

ボタンがクリックされると、ViewModel に SelectedResource というプロパティを設定します。

私がやりたいのは、クリックされたボタンを強調表示することです。

次のように、ボタンの ControlTemplate があります。

<ControlTemplate x:Key="ResourceButtonTemplate" TargetType="{x:Type ButtonBase}">
    <Border Name="SelectedButtonBorder"
            CornerRadius="3">
        <Border x:Name="border" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            CornerRadius="3"
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
            <StackPanel Orientation="Horizontal" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
                <Image Source="{Binding Type.Value, Converter={converter:ResourceTypeToStringConverter}}"></Image>
                <ContentPresenter x:Name="contentPresenter" 
                              ContentTemplate="{TemplateBinding ContentTemplate}" 
                              Content="{TemplateBinding Content}" 
                              ContentStringFormat="{TemplateBinding ContentStringFormat}" 
                              Focusable="False"  
                              Margin="{TemplateBinding Padding}" 
                              RecognizesAccessKey="True" 
                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </StackPanel>
        </Border>
    </Border>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding SelectedResource}" Value="">
            <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" />
            <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" />
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

DataTrigger を試しましたが、datatrigger の value プロパティをバインドできません。

では、XAML のみを使用してそれを行う方法はありますか?

編集:

SelectedResource を空の文字列と比較したくありません。実際に何と比較すればよいかわかりません。SelectedResource オブジェクトのプロパティの 1 つと、ボタンに表示されるテキストを比較してみました。

4

3 に答える 3

0

ビューの をビュー モデルのインスタンスに正しく設定したと仮定すると、次のように使用してプロパティDataContextにアクセスできるはずです。SelectedResourceRelativeSource Binding

<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value="">
    <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" />
    <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" />
</DataTrigger>

this を使用して、フレームワークはof 型Bindingの親を探し、それが見つかると、そのオブジェクト セットを調べ、最後にそのオブジェクトで名前が付けられたプロパティを探します。ButtonYourUserControlDataContextSelectedResource


更新 >>>

値を使用する限り、どの値を使用してもかまいません。ボタンがクリックされたときに、 ViewModel に SelectedResource というプロパティを設定したとおっしゃいました。Button.Name値をSelectedResource... に保存するとしましょうDataTrigger。もちろん、DataTriggerそれぞれに対してわずかに異なるものを作成する必要がありButtonます。

<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value="Button1">
    ...
</DataTrigger>
...
<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value="Button8">
    ...
</DataTrigger>

その場合の問題は、を使用して要素ItemsControlを表示できないことです。Button

于 2013-11-14T16:08:38.767 に答える
0

各ボタンの DataContext が指定されていると仮定するとResource、データトリガーでのバインディングは失敗します。

クラスにboolプロパティIsSelectedがあります。Resource次に、トリガーは次のようになります。

<DataTrigger Binding="{Binding IsSelected}" Value="True">
    <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" />
    <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" />
</DataTrigger>

もちろん、一度に 1 つしか選択できない場合は、アイテムの選択解除を処理する必要があります。

于 2013-11-14T16:19:26.367 に答える
0

または、次のようなことを試しましたか?

<Button>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding SelectedResource}" Value="1">
                            <Setter Property="Background"  Value="Red" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding SelectedResource}" Value="2">
                            <Setter Property="Background"  Value="White" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
于 2013-11-14T16:13:14.090 に答える