WPF DataGrid有条件的RowHeader问题

时间:2011-07-16 05:50:52

标签: wpf

我想在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;
}

1 个答案:

答案 0 :(得分:0)

TextBox仅创建一次。您可以将TextBox作为资源添加到某个字典中,并将x:IsShared设置为false,然后使用StaticResourceMarkupExtension引用它,这样每次调用都会创建一个新的。

(由于x:Shared无法在代码中设置此方法应该用于XAML,我没有看到任何理由为什么人们想要在代码中首先执行此操作)