C# 如何绑定GridViewColumn';在代码中显示MemberBinding

C# 如何绑定GridViewColumn';在代码中显示MemberBinding,c#,wpf,binding,gridviewcolumn,C#,Wpf,Binding,Gridviewcolumn,我有一个使用GridViewColumnCollection的多列TreeView。根据我的情况,我不知道会有多少列,也不知道它们的标题名。这就是运行时的发现 因此,我需要在代码中创建这些列并动态绑定到它们 好的-创建非常简单: GridViewColumn c = new GridViewColumn(); c.Header = "Next Column"; myTree.Columns.Add(c); 现在我遇到了问题-假设我希望绑定到viewModel的“MyName”属性: Bindi

我有一个使用GridViewColumnCollection的多列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>
绑定现在可以完美地针对标题工作-非常感谢。

(从注释中提取答案:)

您可以使用如下代码手动设置绑定:

Binding myBinding = new Binding("MyName");
myBinding.Source = viewModel;
BindingOperations.SetBinding(myTree.Columns[i], GridViewColumn.HeaderProperty, myBinding);
<Grid>
        <ListView Margin="5" Name="ListViewTest"></ListView>
</Grid>
其中
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,如下所示:

Binding myBinding = new Binding("MyName");
myBinding.Source = viewModel;
BindingOperations.SetBinding(myTree.Columns[i], GridViewColumn.HeaderProperty, myBinding);
<Grid>
        <ListView Margin="5" Name="ListViewTest"></ListView>
</Grid>
结果是:


绑定myBinding=新绑定(“MyName”);myBinding.Source=viewModel听起来不错!但是BindingOperations.SetBinding(myTree,GridViewColumn,myBinding)呢;在这种情况下,设置绑定的前两个参数将使用什么?GridViewColumn不是DO,我将使用哪一个GridViewColumn的DP?可能是
BindingOperations.SetBinding(myTree.Columns[I],GridViewColumn.HeaderProperty,myBinding)
其中
i
是列数?顺便说一句,
GridViewColumn
(好吧,否则它就不会有DPs)。太好了!还有一个问题-如何设置单元格的值绑定?在viewModel中,项公开将在单元格中显示的“描述”。ItemsSource设置为PublicObservableCollection Items-其中,在XAML中,DisplayMemberBinding=“{Binding Description}”。我如何设置DisplayMemberBinding的绑定?谢谢-我知道:)-我没有意识到绑定是从BindingBase派生的-DUH!
    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;

    }