【发布时间】:2012-10-19 07:41:12
【问题描述】:
我有一个使用 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,GridViewColumn.???? , myBinding);在这种情况下,我会为 SetBinding 的前两个参数使用什么? GridViewColumn 不是 DO,我会使用 GridViewColumn 的哪个 DP?
-
也许
BindingOperations.SetBinding(myTree.Columns[i], GridViewColumn.HeaderProperty, myBinding);i是列数? -
和顺便说一句,
GridViewColumnis a DO(好吧,否则它不可能有 DP)。 -
完美!还有一个问题 - 如何设置 Cell 的值绑定?在 viewModel 中,Item 公开了要在单元格中显示的“描述”。 ItemsSource 设置为 public ObservableCollection
- Items - 在 XAML 中,DisplayMemberBinding="{Binding Description}"。如何设置 DisplayMemberBinding 的绑定?
标签: c# wpf binding gridviewcolumn