簡體   English   中英

DataGrid 項源綁定未更新且 WPF 中的綁定不起作用

[英]DataGrid itemsource binding not updating and binding in WPF not working

當 itemsource 以編程方式更改時,我無法成功更新我的 WPF Datagrid。

XAML

<DataGrid Name="ReaderGrid" ItemsSource="{Binding myData}" Height="Auto" Width="Auto" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" IsReadOnly="True" GridLinesVisibility="None">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Count" Width="*" FontSize="14" Binding="{Binding count}" />
        <DataGridTextColumn Header="Total" Width="*" FontSize="14" Binding="{Binding total}" />
    </DataGrid.Columns>
</DataGrid>

XAML.CS(代碼隱藏)

public partial class MainWindow : Window
{
    public ObservableCollection<obj> myData { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        myData = new ObservableCollection<obj>();
        InitializeMyData();

最后一個函數 (InitializeMyData()) 只是用測試信息填充 myData。

最后對象只是一些測試類

public class obj
{
    public int count { get; set; }
    public double total { get; set; }
}

代碼 AS-IS 不起作用,除了我在 WPF 中的數據網格為空之外沒有任何錯誤 - 我發現解決此問題的唯一方法是在初始化數據后添加以下代碼

ReaderGrid.ItemsSource = myData;

現在顯示了我所有的初始數據,除了在此之后的任何時間點,如果我更改 myData 我希望/期望更改自動反映在我的 WPF Datagrid 中,遺憾的是沒有任何更新......

問題 - 為什么我的 WPF 綁定不起作用(為什么我需要在 ItemSource 后面的代碼中顯式設置),以及為什么對 myData 的更改沒有更新我的 Datagrid?

謝謝,

像這樣的綁定

ItemsSource="{Binding myData}" 

沒有明確定義綁定的源對象,而只定義源屬性。 它要求設置綁定目標的 DataContext,然后將其用作源對象。

DataContext 從父元素繼承到子元素,並且通常在窗口的構造函數中設置,如下所示。

這里是 MainWindow 實例,因為類 MainWindow 擁有源屬性,但通常它是聲明綁定源屬性的視圖模型類的實例(並且還實現 INotifyPropertyChanged 接口以通知屬性值更改)。

public ObservableCollection<obj> myData { get; } = new ObservableCollection<obj>();

public MainWindow()
{
    InitializeComponent();
    InitializeMyData();

    DataContext = this;
}

另請注意,根據廣泛接受的編碼約定,C# 屬性名稱以大寫字母開頭,因此您的屬性最好命名為MyData


對於您的第二個問題,即未更新的數據,您的數據項類必須實現INotifyPropertyChanged接口,例如:

public class obj : INotifyPropertyChanged 
{
    public event PropertyChanged;

    private int _count;
    public int Count
    {
        get { return _count; }
        set
        {
            _count = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
        }
    }
}

有關 WPF 數據綁定的所有詳細信息,請參閱 MSDN 上的數據綁定概述文章。

暫無
暫無

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

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