【问题标题】:WPF DataGrid binding to property in subclassWPF DataGrid 绑定到子类中的属性
【发布时间】:2020-05-01 09:33:07
【问题描述】:

我正在努力思考如何正确地将数据网格列与子类中的数据绑定。为了澄清问题,我做了一个小示例,如果解决了,将对使代码正常工作有很大帮助。

以下是定义的类:

public class SubItem
    {
        public string Data { get; set; }
    }

public class Item
    {
        public int Value { get; set; }
        public SubItem Data { get; set; }
    }

然后我创建一个 observablecollection,如下所示:

public class IntData : ObservableCollection<Item>
    {
        public IntData() : base()
        {
            Item i = new Item() { Value = 56, Data = new SubItem() { Data = "testdata" } };
            Add(i);
        }
    }

这是我的 MainWindow 代码:

public partial class MainWindow : Window
    {
        public IntData Integers { get; set; }

        public MainWindow()
        {
            Integers = new IntData();

            InitializeComponent();
            dataGrid1.ItemsSource = Integers; // This is an important line
        }
    }

XAML 代码保持简单:

<DataGrid Name="dataGrid1" AutoGenerateColumns="False" Margin="12">
   <DataGrid.Columns>
      <DataGridTextColumn Header="Integers" Binding="{Binding Value}"/>
      <DataGridTextColumn Header="Data" Binding="{Binding Data}"/>
   </DataGrid.Columns>
</DataGrid>

运行上面的代码,您会注意到 Integers 正在正常工作,但 Data 列却没有。 任何人关于如何使该列显示 Data 属性的任何想法? 提前致谢!

【问题讨论】:

  • 您可以简单地覆盖SubItem 类中的ToString() 方法,或者为此定义日期列模板
  • 也可以绑定到子类&lt;DataGridTextColumn Header="Data" Binding="{Binding Data.Data}"/&gt;

标签: c# wpf data-binding datagrid


【解决方案1】:

修复它的最简单方法是覆盖SubItem 类中的ToString() 方法并返回Data 属性

public class SubItem
{
    public string Data { get; set; }

    public override string ToString()
    {
        return Data;
    }
}

另一个选项是更新DataGridTextColumn 绑定并使用Data 类的Data 属性的Data 子属性(您可能需要更新命名:))

<DataGridTextColumn Header="Data" Binding="{Binding Data.Data}"/>

更复杂的选择是使用DataGridTemplateColumn 并定义您自己的模板来表示数据

<DataGridTemplateColumn Header="Data">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Data.Data}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【讨论】:

  • @JediMaster 添加一行时,应该填充整个SubItem 类,而不是简单的字符串
  • 啊,但现在我得到 System.InvalidOperationException: 'Two-way binding requires Path or XPath.' 当我添加一行时。你知道为什么吗?当我只使用没有 SubItem 类的 Item 类进行测试时,我没有收到该错误
  • 我正在通过 Datagrid 本身添加一行并得到双向路径错误。不应该可以使用 Datagrid 本身添加新行吗?
  • @JediMaster 我不认为它会以这种方式工作。请看我之前的评论。如果解决方案不起作用,您可以不批准答案,但您的错误与您在原始问题中提出的不同
  • 好的,我会尝试提出另一个关于此的问题,看看是否可以得到指点。再次感谢您的帮助:)!
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2010-12-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多