【发布时间】:2009-10-09 20:17:28
【问题描述】:
我正在尝试制作一个项目模板,其中我的堆栈面板中的某些字段可以为空。当它为空时,我想将可见性设置为折叠。我尝试放置触发器,但它似乎不起作用,我对 WPF 的这一部分不是很熟悉
另外,当绑定中的特定值为真时,我想更改此项目的背景颜色。是一样的吗?
谢谢。
【问题讨论】:
标签: wpf textblock itemtemplate
我正在尝试制作一个项目模板,其中我的堆栈面板中的某些字段可以为空。当它为空时,我想将可见性设置为折叠。我尝试放置触发器,但它似乎不起作用,我对 WPF 的这一部分不是很熟悉
另外,当绑定中的特定值为真时,我想更改此项目的背景颜色。是一样的吗?
谢谢。
【问题讨论】:
标签: wpf textblock itemtemplate
使用 ViewModel 是解决此类问题的一种方法。
如果您的数据存储在 Item 类中,您将创建一个 ItemViewModel 来包装 Item 以在您的项目控件中显示。 ViewModel 类将实现 INotifyProperty 更改以更新显示,并且设置器将引发 PropertyChanged 事件并传递适当的属性名称。您还可以根据需要为尽可能多的相互关联的更改字段引发属性更改事件。
假设您希望 Item.Description 在 Description 为空时显示在折叠字段中。您的 ViewModel 属性可能如下所示
public string Description
{
get { return mItem.Description; }
set { mItem.Description = value; Notify("Description"); Notify("DescriptionVisibility"); }
}
public Visibility DescriptionVisibility
{
get { return string.IsNullOrEmpty(mItem.Description) ? Visibility.Visible : Visibility.Collapsed; }
}
在 XAML 中,将 text 属性绑定到 Description,并将 Visibility 属性绑定到 DescriptionVisibility。
【讨论】:
如果要隐藏内容为空的项目,则必须重新定义其ListBoxItem 的ControlTemplate(或ListViewItem 或其他内容,具体取决于您使用的项目容器)并使用触发器以DataContext为目标,例如:
<DataTrigger Binding="{Binding}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
但是,我建议您使用 CollectionView 上的 Filter 委托直接从视图中排除空项目,以避免折叠未使用的项目。
例如要排除空对象,在你后面的代码中,使用:
CollectionViewSource.GetDefaultView(yourCollection).Filter = o => o != null;
【讨论】: