![](/img/trans.png)
[英]WPF GridViewColumn's DisplayMemberBinding using a Dictionary Key's Value
[英]How to bind GridViewColumn's DisplayMemberBinding in code
我有一個使用GridViewColumnCollection的MultiColumn TreeView。 我的情況,我不知道會有多少列,也不知道它們的標題名稱。 那是在運行時發現的。
因此,我需要在代碼中創建這些列並動態綁定到它們。
好的 - 創作很簡單:
GridViewColumn c = new GridViewColumn();
c.Header = "Next Column";
myTree.Columns.Add(c);
現在我絆倒了 - 假設我希望綁定到我的viewModel的“MyName”屬性:
Binding myBinding = new Binding(??);
myBinding.Source = ??
BindingOperations.SetBinding(myTree,GridViewColumn.???? , myBinding);
現在是這個的模板
<DataTemplate x:Key="CellTemplate_Name">
<DockPanel>
<ToggleButton x:Name="Expander"
Margin="{Binding Level,
Converter={StaticResource LevelToIndentConverter},
RelativeSource={RelativeSource AncestorType={x:Type l:TreeListViewItem}}}"
ClickMode="Press"
IsChecked="{Binding Path=IsExpanded,
RelativeSource={RelativeSource AncestorType={x:Type l:TreeListViewItem}}}"
Style="{StaticResource ExpandCollapseToggleStyle}" />
<TextBlock Text="{Binding Name}" />
.
.
.
<Style TargetType="{x:Type l:TreeListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type l:TreeListViewItem}">
<StackPanel>
<Border Name="Bd"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<GridViewRowPresenter x:Name="PART_Header"
Columns="{Binding Path=Columns,
RelativeSource={RelativeSource AncestorType={x:Type l:TreeListView}}}"
Content="{TemplateBinding Header}" />
</Border>
<ItemsPresenter x:Name="ItemsHost" />
</StackPanel>
XAML中的列插入和綁定顯示為:
<l:TreeListView x:Name="myTree" ItemsSource="{Binding MySource}">
<l:TreeListView.Columns>
<GridViewColumn x:Name="GridViewColumn0" CellTemplate="{StaticResource CellTemplate_Name}"
Header="Name" />
<GridViewColumn Width="60"
DisplayMemberBinding="{Binding Description}"
Header="Description" />
任何有關SetBinding的幫助將不勝感激。 我一直在搜尋,直到我的手指脫落。
更新:優秀答案:
GridViewColumn c = new GridViewColumn();
c.Header = "Next Column";
myTree.Columns.Add(c);
Binding myBinding = new Binding("MyName");
myBinding.Source = viewModel;
BindingOperations.SetBinding(myTree.Columns[myTree.Columns.Count - 1],
GridViewColumn.HeaderProperty,
myBinding);
綁定現在可以完美地對抗Header - 非常感謝你。
(從評論中提取答案:)
您可以使用以下代碼手動設置綁定:
Binding myBinding = new Binding("MyName");
myBinding.Source = viewModel;
BindingOperations.SetBinding(myTree.Columns[i], GridViewColumn.HeaderProperty, myBinding);
其中i
是列數。
要設置DisplayMemberBinding
,可以使用更簡單的代碼:
Binding descriptionBinding = new Binding("Description");
myTree.Columns[i].DisplayMemberBinding = descriptionBinding;
我使它成為一個方法NewGridViewColumn
,設置參數header
和bindingName
到方法,你將得到一個綁定完成的GridViewColumn:
private GridViewColumn NewGridViewColumn(string header, string bindingName)
{
GridViewColumn gvc = new GridViewColumn();
gvc.Header = header;
gvc.DisplayMemberBinding = new Binding(bindingName);
return gvc;
}
。
然后在ListView xaml的情況下像這樣:
<Grid>
<ListView Margin="5" Name="ListViewTest"></ListView>
</Grid>
您可以使用NewGridViewColumn
在構造函數中輕松地將GridViewColumn添加到ListView:
public MainWindow()
{
InitializeComponent();
//Give the Source to ListViewTest
//ProduceNames() makes a List<NameClass> that
//NameClass has 3 property Name1,Name2,Nmae3
ListViewTest.ItemsSource = ProduceNames();
GridView gview = new GridView();
//add some GridViewColumns to the gview
gview.Columns.Add(NewGridViewColumn("FirstName","Name1"));
gview.Columns.Add(NewGridViewColumn("SecondName","Name2"));
gview.Columns.Add(NewGridViewColumn("ThirdName","Name3"));
//set the gview to the ListViewTest's View
ListViewTest.View = gview;
}
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.