如何将Wpf DataGridColumn绑定到对象?

5 wpf datagrid

我想将我的WPF DataGrid的列绑定到Dictionary中的某些对象,如下所示:

绑定路径=对象[i]

其中Objects是我的对象字典,因此每个单元格都代表一个Object元素.我怎样才能做到这一点?

我想我需要为我的单元格创建一个模板,我做了,但是如何在模板中获得列绑定的结果?我知道默认情况下,DataGridCell的内容是一个TextBlock,它的Text属性是通过列绑定结果设置的,但如果该结果是一个对象,我想我必须创建一个ContentTemplate.我怎么做,因为我尝试的东西没有显示任何东西.

这是我试过的:

<Style x:Key="CellStyle" TargetType="{x:Type dg:DataGridCell}">
    <Setter Property="Template"> ---it should realy be ContentTemplate?
      <Setter.Value>
        <ControlTemplate>
          <controls:DataGridCellControl CurrentObject="{Binding }"/> -- I would expect to get the object like this for this column path : Path=Objects[i] but is not working
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
Run Code Online (Sandbox Code Playgroud)

因此,为了使自己完全清楚,我想在我的DataGridCellControl的CurrentObject属性中获取当我在数据网格中设置列绑定时应该产生的当前对象,如此Path = Objects [i].

谢谢你的任何建议,

约翰.

Car*_*rlo 0

尝试这个:

<ListView x:Name="listViewUsers" SelectionMode="Single" 
                              ItemsSource="{Binding ElementName=window1, Path=Users, Mode=TwoWay}" MouseDoubleClick="listViewUsers_MouseDoubleClick">
                        <ListView.View>
                            <GridView x:Name="gridViewUsers" AllowsColumnReorder="False">
                                <GridViewColumn>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Image Source="{Binding Path=IsAdministrator, Converter={StaticResource boolToImage}, ConverterParameter='Images/admin18.gif|Images/user18.gif'}" />
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Header="User Name" DisplayMemberBinding="{Binding Path=UserName}" Width="140" />
                                <GridViewColumn Header="Full Name" DisplayMemberBinding="{Binding Path=FullName}" Width="140" />
                                <GridViewColumn Header="Phone Number" DisplayMemberBinding="{Binding Path=PhoneNumber}" Width="110" />
                                <GridViewColumn Header="Access Type" DisplayMemberBinding="{Binding Path=AccessType}" Width="110">
                                </GridViewColumn>
                                <GridViewColumn>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Image Cursor="Hand" ToolTip="Delete User" Stretch="None" Source="Images/trash12.gif" MouseUp="DeleteUser" />
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
Run Code Online (Sandbox Code Playgroud)

其中 ItemsSource="{Binding ElementName=window1, Path=Users, Mode=TwoWay}"

  • ElementName 是 XAML 中窗口的名称(只需将 x:Name="window1" 添加到 Window 标记,就像任何其他控件一样。

  • 用户是一个列表,应该与字典一样工作

  • Mode=TwoWay 表示如果网格被修改,列表也会被修改,反之亦然(双向绑定)

编辑:

尝试这个:

XAML:

<ListView x:Name="listViewTest" ItemsSource="{Binding}">
<ListView.View>
    <GridView x:Name="gridViewTest">

    </GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

C#:

public class TheClass
    {
        public int Col1, Col2, Col3; 
        public Dictionary<int, OtherColumns> otherColumns = new Dictionary<int,OtherColumns>();
    }

    public class OtherColumns
    {
        public string ColumnName;
        public int Value;
    }
Run Code Online (Sandbox Code Playgroud)

并在Window_Loaded下调用该方法:

private void PopulateListView()
        {
            TheClass c = new TheClass();

            c.Col1 = 10;
            c.Col2 = 20;
            c.Col3 = 30;


            c.otherColumns.Add(0, new OtherColumns() { ColumnName = "Col4", Value = 40 });
            c.otherColumns.Add(1, new OtherColumns() { ColumnName = "Col5", Value = 50 });
            c.otherColumns.Add(3, new OtherColumns() { ColumnName = "Col6", Value = 60 });

            DataTable table = new DataTable();

// adding regular columns
            table.Columns.Add("Col1", typeof(int));
            table.Columns.Add("Col2", typeof(int));
            table.Columns.Add("Col3", typeof(int));

// adding dynamic columns
            foreach (KeyValuePair<int, OtherColumns> pair in c.otherColumns)
            {
                table.Columns.Add(pair.Value.ColumnName, typeof(int));
            }

            DataRow row = table.NewRow();

// adding regular column values to the DataTable
            row["Col1"] = c.Col1;
            row["Col2"] = c.Col2;
            row["Col3"] = c.Col3;

// adding dynamic column values to the DataTable
            foreach (KeyValuePair<int, OtherColumns> pair in c.otherColumns)
            {
                row[pair.Value.ColumnName] = pair.Value.Value;
            }

            table.Rows.Add(row);

            // Start binding the table.
            gridViewTest.Columns.Clear();

            System.Windows.Controls.GridViewColumn gvc;
            Binding binding;

            foreach (DataColumn column in table.Columns)
            {
                gvc = new System.Windows.Controls.GridViewColumn();
                binding = new System.Windows.Data.Binding();
                binding.Path = new PropertyPath(column.ColumnName);
                binding.Mode = BindingMode.OneWay;
                gvc.Header = column.Caption;
                gvc.DisplayMemberBinding = binding;
                gridViewTest.Columns.Add(gvc);
            }

            listViewTest.DataContext = table;
        }
Run Code Online (Sandbox Code Playgroud)

我并不是说这是最好的解决方案,但它可能会有所帮助。让我知道。