我想在WPF数据网格中有条件地显示不同的RowHeader内容。例如。我的模型有两个属性,Name和IsSuperHero。如果该行代表超级英雄,我想在行标题中显示带有“SH”的文本框。
我正在尝试使用datatriggers实现此目的,如下所示。问题是,文本框仅显示在一行(最后一个匹配的行)上。 下面,我希望“SH”能够对抗超人和蝙蝠侠,但它只会出现在对阵蝙蝠侠的情况下。如果我在Name列上排序,记录将被排序为'Batman,John,Peter,Superman',现在'SH'标题显示为'Superman'(恰好是最后一个匹配记录)。 我在这里错过了什么吗?
public class UserModel
{
public String Name { get; set; }
public Boolean IsSuperHero { get; set; }
public UserModel (String name, Boolean issuperhero) { Name = name; IsSuperHero = issuperhero; }
}
public partial class MainWindow : Window
{
private void Window_Loaded (object sender, RoutedEventArgs e){
List<UserModel> list = new List<UserModel>();
list.Add(new UserModel("Peter", false));
list.Add(new UserModel("Superman", true));
list.Add(new UserModel("John", false));
list.Add(new UserModel("Batman", true));
myDataGrid.ItemsSource = list;
//Show Header 'SH' for Super Hero
TextBox txtBox = new TextBox();
txtBox.Text = "SH";
Style rowStyle = new Style();
DataTrigger dataTrigger = new DataTrigger();
dataTrigger.Binding = new Binding("IsSuperHero");
dataTrigger.Value = true;
Setter setter = new Setter(DataGridRow.HeaderProperty, txtBox);
dataTrigger.Setters.Add(setter);
rowStyle.Triggers.Add(dataTrigger);
myDataGrid.RowStyle = rowStyle;
}
答案 0 :(得分:0)
TextBox仅创建一次。您可以将TextBox作为资源添加到某个字典中,并将x:IsShared
设置为false,然后使用StaticResourceMarkupExtension
引用它,这样每次调用都会创建一个新的。
(由于x:Shared
无法在代码中设置此方法应该用于XAML,我没有看到任何理由为什么人们想要在代码中首先执行此操作)