如何更改属性根据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>
有可能吗?
答案 0 :(得分:2)
我并不完全清楚CheckBox.Template
的样子。 Icons:ExIcon
对照对我来说也是一个谜。无论如何这里是一个小例子。它使用Rectangle而不是ExIcon。但是您可以轻松地替换它;-)我通过IsSelected
直接绑定到DataTrigger
,而不是通过ElementName
或RelativeSource
进行搜索。
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
属性来指示行是否被选中。