首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataBinding for DataGrid不工作?

DataBinding for DataGrid不工作?
EN

Stack Overflow用户
提问于 2015-08-02 04:26:54
回答 2查看 140关注 0票数 2

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

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

代码语言:javascript
复制
public ObservableCollection<CalculatedData> calculatedData { get; set; }

在我的代码中,我使用这一行实际更新或添加列表中的数据。

代码语言:javascript
复制
calculatedData = await CalculateData();

CalculateData函数定义如下:

代码语言:javascript
复制
private Task<ObservableCollection<CalculatedData>> CalculateData()
{
    return Task.Run(() =>
    {
        ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();
        // Do a lot of stuff
        return cdList;
    });
}

对于我的xaml,我有一个简单的DataGrid,如下所示:

代码语言:javascript
复制
<DataGrid Name="dataGrid" ItemsSource="{Binding calculatedData}" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />

的问题:,为什么DataGrid没有被提升?这会解决我闪烁的问题,因为我没有重新绑定?

-

更新

我甚至更改了我的主要声明如下(因为Iv‘看到它是这样做的),但我仍然没有使它发挥作用。

代码语言:javascript
复制
private ObservableCollection<CalculatedData> calculatedData = new ObservableCollection<CalculatedData>();
public ObservableCollection<CalculatedData> CalculatedData
{
    get { return calculatedData; }
    set
    {
        calculatedData = value;
    }
}

XAML:

代码语言:javascript
复制
<DataGrid Name="dataGrid" ItemsSource="{Binding CalculatedData}" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-02 05:30:01

如果你简单地做了:

代码语言:javascript
复制
    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        calculatedData = await CalculateData();
        dataGrid1.ItemsSource = calculatedData;
    }

看起来不错。我猜您的XAML绑定可能不起作用,因为没有定义DataContext

编辑:这是完整的代码,

MainWindow:

代码语言:javascript
复制
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;
        });
    }
}

XAML:

代码语言:javascript
复制
<Grid>
    <DataGrid x:Name="dataGrid1" Margin="0" />
</Grid>

结果:

编辑2:添加了一个按钮并移动了一些代码,这样你就可以进行测试了。

代码语言:javascript
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-08-02 05:40:04

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

代码语言:javascript
复制
var data = await CalculateData();
foreach(var d in data)
   calculatedData.Add(d);

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

代码语言:javascript
复制
CalculatedData = new ObservableCollection<yourType>();

如果这有用的话请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31768551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档