2011-07-16 18 views
0

条件付きで別のRowHeaderの内容をWPFデータグリッドに表示したい。例えば。 My ModelにはNameとIsSuperHeroの2つのプロパティがあります。行がスーパーヒーローを表している場合は、行ヘッダーに 'SH'というテキストボックスを表示します。WPF DataGrid条件付きRowHeaderの問題

私は以下のようにdatatriggersを使用してこれを達成しようとしています。問題は、テキストボックスが1つの行(最後に一致する行)にのみ表示されることです。 以下、スーパーマンとバットマンに対して 'SH'が表示されることを期待していますが、バットマンに対してのみ表示されます。名前列を並べ替えると、レコードは「バットマン、ジョン、ピーター、スーパーマン」にソートされ、「SH」ヘッダーは「スーパーマン」に対して表示されます(最後に一致するレコードです)。 ここに何か不足していますか?

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

テキストボックスは1回だけ作成されます。テキストボックスを辞書のリソースとして追加し、x:IsSharedをfalseに設定してからStaticResourceMarkupExtensionを使用して参照すると、すべての呼び出しで新しいものが作成されます。

+0

おかげH.B.を(x:Sharedをコードで設定することができないように、このアプローチは、1が最初の場所でのコードでこれをしたいと思う理由私はいかなる理由が表示されない、XAMLに取られるべきです)そのトリックをした。あなたはなぜ、 'shared = true'リソースがdatagrid-columnでは動作するのか、datagrid-headerでは動作しないのか説明できますか? – knowit

関連する問題