如何在WPF中的datatemplate中使用触发器

时间:2016-11-03 07:51:16

标签: c# wpf

如何更改属性根据IsChecked属性填写当前所选元素的图标?

我的资源词典:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- (...) --> 
        </ResourceDictionary.MergedDictionaries>
        <DataTemplate x:Key="FooTemplate">
            <Icons:ExIcon Fill="Red"
                          Width="12"
                          Height="Auto">
                <!--
                <Icons:ExIcon.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={???}}, Path=???}" Maybe here?
                       Value="???"/>
                </Icons:ExIcon.Triggers>
                -->
            </Icons:ExIcon>
        </DataTemplate> 
        <!-- (...) -->
        <styles:IconSelector x:Key="IconSelector"
                             FooTemplate="{StaticResource FooTemplate}"
                             FooTemplateSSecond="{StaticResource FooTemaplteSecond}"/>

和列表框:

<ListBox ItemsSource="{Binding DataSources}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <!-- (...) --> 
                <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}">
                    <CheckBox.Template>
                        <!-- (...) --> 
                        <ContentControl Name="Icon"
                                        Content="{Binding}"
                                        ContentTemplateSelector="{StaticResource IconSelector}"
                                        HorizontalAlignment="Right"
                                        Grid.Column="1"/>
                        <!-- (...) --> 
                    </CheckBox.Template>
                </CheckBox>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

有可能吗?

1 个答案:

答案 0 :(得分:2)

我并不完全清楚CheckBox.Template的样子。 Icons:ExIcon对照对我来说也是一个谜。无论如何这里是一个小例子。它使用Rectangle而不是ExIcon。但是您可以轻松地替换它;-)我通过IsSelected直接绑定到DataTrigger,而不是通过ElementNameRelativeSource进行搜索。

XAML:

       <ListBox ItemsSource="{Binding}">
        <ListBox.Resources>
            <DataTemplate x:Key="template1">
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Path=IsSelected}" />
                    <Rectangle Height="20"
                               Width="20">
                        <Rectangle.Style>
                            <Style TargetType="Rectangle">
                                <Setter Property="Fill"
                                        Value="Blue" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=IsSelected}"
                                                 Value="True">
                                        <Setter Property="Fill"
                                                Value="Red" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Rectangle.Style>
                    </Rectangle>
                </StackPanel>
            </DataTemplate>
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ContentControl ContentTemplate="{StaticResource template1}" Content="{Binding}">

                </ContentControl>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

注意 Content="{Binding}"。这会将DataContext的{​​{1}}设置为ContentPresenter的“实际”DataContext。如果您使用VS2015,可以使用VisualTreeViewer进行调查,否则您可以使用https://snoopwpf.codeplex.com/

您还应该考虑将ListBoxItem重命名为IsSelected。 Noramlly你使用IsChecked属性来指示行是否被选中。