【发布时间】:2015-03-14 18:10:40
【问题描述】:
在使用 WPF 一段时间后,这实际上是我第一次遇到这样一种情况,即我有一个 ListBox 的 ItemTemplate,我希望根据项目本身之外的属性对其进行配置。当我想要一个字体选择器对话框时出现问题,用户可以在其中单击复选框以启用字体预览(实际上我改变了对这个实现的想法,但我仍然想知道答案)。
看来,因为 DataTemplate 可以在提供该类型的任何情况下使用,所以它被认为是一种很好的做法,不要绑定到项目配置之外的任何参数(似乎绑定到包含 DataTemplate 的属性的代码是特别迟钝。)
我想知道我应该如何实现这种情况。下面的代码有效,但绑定的是可视元素,而我宁愿绑定到 ViewModel 中的属性。
<Window x:Class="ScreenWriter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}" >
<Grid>
<StackPanel>
<CheckBox Name="ShowPreview" IsChecked="{Binding IsShowPreviewChecked}">
Show Preview
</CheckBox>
<ListBox ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}">
<TextBlock.Style>
<Style>
<Setter Property="TextBlock.FontFamily" Value="Arial" />
<Style.Triggers>
<DataTrigger Value="True" Binding="{Binding IsChecked, ElementName=ShowPreview}">
<Setter Property="TextBlock.FontFamily" Value="{Binding}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Grid>
</Window>
这似乎不是一个不寻常的情况,但我找不到任何不以“这是一种巧妙的方法来解决你不应该做的事情”为前缀的解决方案。 感谢您的帮助...
【问题讨论】:
标签: c# wpf xaml data-binding datatemplate