C# DataGrid的数据绑定不工作?

C# DataGrid的数据绑定不工作?,c#,wpf,xaml,data-binding,datagrid,C#,Wpf,Xaml,Data Binding,Datagrid,我正在使用一个简单WPF应用程序的主窗口类中定义的ObservableCollection。由于某些原因,列表会更新(我在调试时可以看到),但是UI不会更新 现在,如果我创建一个计时器并循环它,我可以通过设置ItemSource来更新DataGrid。这是可行的,但会在我的数据网格中引起可怕的闪烁 public ObservableCollection<CalculatedData> calculatedData { get; set; } CalculateData函数定义如下:

我正在使用一个简单WPF应用程序的主窗口类中定义的
ObservableCollection
。由于某些原因,列表会更新(我在调试时可以看到),但是UI不会更新

现在,如果我创建一个
计时器
并循环它,我可以通过设置
ItemSource
来更新
DataGrid
。这是可行的,但会在我的数据网格中引起可怕的闪烁

public ObservableCollection<CalculatedData> calculatedData { get; set; }
CalculateData
函数定义如下:

private Task<ObservableCollection<CalculatedData>> CalculateData()
{
    return Task.Run(() =>
    {
        ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();
        // Do a lot of stuff
        return cdList;
    });
}
问题:为什么数据网格没有升级?这会解决我的闪烁问题,因为我没有重新绑定

-

更新

我甚至将我的主要声明更改为以下内容(因为我看到它是这样做的),但我仍然没有让它发挥作用

private ObservableCollection<CalculatedData> calculatedData = new ObservableCollection<CalculatedData>();
public ObservableCollection<CalculatedData> CalculatedData
{
    get { return calculatedData; }
    set
    {
        calculatedData = value;
    }
}
私有ObservableCollection calculatedData=新ObservableCollection();
公共可观测收集计算数据
{
获取{return calculatedData;}
设置
{
计算数据=数值;
}
}
XAML:


如果您只需执行以下操作:

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        calculatedData = await CalculateData();
        dataGrid1.ItemsSource = calculatedData;
    }
它会起作用的。我猜您的XAML绑定可能无法工作,因为未定义
DataContext

编辑:这是完整的代码,

主窗口:

public partial class MainWindow : Window
{
    public ObservableCollection<CalculatedData> calculatedData { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        calculatedData = await CalculateData();
        dataGrid1.ItemsSource = calculatedData;
    }

    private Task<ObservableCollection<CalculatedData>> CalculateData()
    {
        return Task.Run(() =>
        {
            ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();

            // Do a lot of stuff
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });

            return cdList;
        });
    }
}
公共部分类主窗口:窗口
{
公共ObservableCollection calculatedData{get;set;}
公共主窗口()
{
初始化组件();
}
已加载专用异步无效窗口(对象发送方,RoutedEventArgs e)
{
calculatedData=等待calculatedData();
dataGrid1.ItemsSource=calculatedData;
}
私有任务计算数据()
{
返回任务。运行(()=>
{
ObservableCollection cdList=新的ObservableCollection();
//做很多事情
添加(新的计算数据{Data1=1,Data2=2,Data3=3});
添加(新的计算数据{Data1=1,Data2=2,Data3=3});
添加(新的计算数据{Data1=1,Data2=2,Data3=3});
添加(新的计算数据{Data1=1,Data2=2,Data3=3});
添加(新的计算数据{Data1=1,Data2=2,Data3=3});
返回cdList;
});
}
}
XAML:


结果:

编辑2:添加了一个按钮,并将代码移动了一点,以便您可以进行测试

public partial class MainWindow : Window
{
    public ObservableCollection<CalculatedData> calculatedData { get; set; }
    int i;

    public MainWindow()
    {
        InitializeComponent();

        //initialize your binding collection
        calculatedData = new ObservableCollection<CalculatedData>();
    }

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        i = 1;
        //create initial data and bind to data grid
        calculatedData = await CalculateData();
        dataGrid1.ItemsSource = calculatedData;
    }

    private Task<ObservableCollection<CalculatedData>> CalculateData()
    {
        return Task.Run(() =>
        {
            ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();

            // Do a lot of stuff
            for (int j = 0; j < 5; j++)
            {
                cdList.Add(new CalculatedData { Data1 = i, Data2 = i + 1, Data3 = i + 2 });
                i++;
            }

            return cdList;
        });
    }
    private async void button1_Click(object sender, RoutedEventArgs e)
    {
        //place new data in a temporary collection
        ObservableCollection<CalculatedData> newData = await CalculateData();

        //add new data to the collection bound to the data grid
        //preferably, don't just replace it
        //any business logic you may need for adding, 
        //deleting, filtering data, etc goes here 
        foreach (CalculatedData cd in newData)
            calculatedData.Add(cd);
    }
}
公共部分类主窗口:窗口
{
公共ObservableCollection calculatedData{get;set;}
int i;
公共主窗口()
{
初始化组件();
//初始化绑定集合
calculatedData=新的ObservableCollection();
}
已加载专用异步无效窗口(对象发送方,RoutedEventArgs e)
{
i=1;
//创建初始数据并绑定到数据网格
calculatedData=等待calculatedData();
dataGrid1.ItemsSource=calculatedData;
}
私有任务计算数据()
{
返回任务。运行(()=>
{
ObservableCollection cdList=新的ObservableCollection();
//做很多事情
对于(int j=0;j<5;j++)
{
Add(新计算的数据{Data1=i,Data2=i+1,Data3=i+2});
i++;
}
返回cdList;
});
}
专用异步无效按钮1\u单击(对象发送方,路由目标)
{
//在临时集合中放置新数据
ObservableCollection newData=等待计算数据();
//向绑定到数据网格的集合添加新数据
//最好不要只是更换它
//您可能需要添加的任何业务逻辑,
//删除、过滤数据等在此处进行
foreach(新数据中的计算数据cd)
计算数据。添加(cd);
}
}

每次尝试从CalculateData()的结果添加项时,您都在替换源项

也不确定是否在构造函数中初始化了CalculatedData属性init

CalculatedData = new ObservableCollection<yourType>();
CalculatedData=新的ObservableCollection();

让我知道这是否有效

“dataGrid_AutoGeneratingColumn”中发生了什么?@Sajeetharan问得好!我正在删除某个列并重命名其他列标题。所以,没什么不寻常的。这对我来说仍然不起作用。项目在我的列表中,但UI从不更新,我的datagrid只是空白(甚至没有显示标题列)我得到了列标题,但仍然没有数据??您甚至不需要DataContext。我会用完整的代码编辑我的答案。我做的和你做的一样,只是在一个定时器滴答的功能中。然而,这会导致我的DataGrid出现可怕的闪烁。这就是我试图避免的。(以及设置每个滴答声的itemsource)。计时器可能会导致闪烁。但是你也不需要定时器。看一看我发布的完整代码。这很有效!但是为什么我的XAML绑定不起作用?我是否必须实现
observetecollection
而不是一个简单的列表?
public partial class MainWindow : Window
{
    public ObservableCollection<CalculatedData> calculatedData { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        calculatedData = await CalculateData();
        dataGrid1.ItemsSource = calculatedData;
    }

    private Task<ObservableCollection<CalculatedData>> CalculateData()
    {
        return Task.Run(() =>
        {
            ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();

            // Do a lot of stuff
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });
            cdList.Add(new CalculatedData { Data1 = 1, Data2 = 2, Data3 = 3 });

            return cdList;
        });
    }
}
<Grid>
    <DataGrid x:Name="dataGrid1" Margin="0" />
</Grid>
public partial class MainWindow : Window
{
    public ObservableCollection<CalculatedData> calculatedData { get; set; }
    int i;

    public MainWindow()
    {
        InitializeComponent();

        //initialize your binding collection
        calculatedData = new ObservableCollection<CalculatedData>();
    }

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        i = 1;
        //create initial data and bind to data grid
        calculatedData = await CalculateData();
        dataGrid1.ItemsSource = calculatedData;
    }

    private Task<ObservableCollection<CalculatedData>> CalculateData()
    {
        return Task.Run(() =>
        {
            ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();

            // Do a lot of stuff
            for (int j = 0; j < 5; j++)
            {
                cdList.Add(new CalculatedData { Data1 = i, Data2 = i + 1, Data3 = i + 2 });
                i++;
            }

            return cdList;
        });
    }
    private async void button1_Click(object sender, RoutedEventArgs e)
    {
        //place new data in a temporary collection
        ObservableCollection<CalculatedData> newData = await CalculateData();

        //add new data to the collection bound to the data grid
        //preferably, don't just replace it
        //any business logic you may need for adding, 
        //deleting, filtering data, etc goes here 
        foreach (CalculatedData cd in newData)
            calculatedData.Add(cd);
    }
}
var data = await CalculateData();
foreach(var d in data)
   calculatedData.Add(d);
CalculatedData = new ObservableCollection<yourType>();