簡體   English   中英

WPF DataGrid 綁定到子類中的屬性

[英]WPF DataGrid binding to property in subclass

我試圖圍繞如何正確地將數據網格列與子類中的數據綁定在一起。 為了澄清問題,我做了一個小示例,如果解決了,將對使代碼正常工作有很大幫助。

以下是定義的類:

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 class 中的ToString()方法並返回Data屬性

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

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

另一個選項是更新DataGridTextColumn綁定並使用來自Item class 的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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM