我正在使用在简单WPF应用程序的MainWindow类中定义的MainWindow。由于某些原因,列表更新(在调试时我可以看到),但是UI不更新。
现在,如果我创建一个Timer并循环它,我可以通过设置ItemSource来更新ItemSource。这是可行的,但会在我的DataGrid中引起可怕的闪烁。
public ObservableCollection<CalculatedData> calculatedData { get; set; }在我的代码中,我使用这一行实际更新或添加列表中的数据。
calculatedData = await CalculateData();CalculateData函数定义如下:
private Task<ObservableCollection<CalculatedData>> CalculateData()
{
return Task.Run(() =>
{
ObservableCollection<CalculatedData> cdList = new ObservableCollection<CalculatedData>();
// Do a lot of stuff
return cdList;
});
}对于我的xaml,我有一个简单的DataGrid,如下所示:
<DataGrid Name="dataGrid" ItemsSource="{Binding calculatedData}" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />的问题:,为什么DataGrid没有被提升?这会解决我闪烁的问题,因为我没有重新绑定?
-
更新
我甚至更改了我的主要声明如下(因为Iv‘看到它是这样做的),但我仍然没有使它发挥作用。
private ObservableCollection<CalculatedData> calculatedData = new ObservableCollection<CalculatedData>();
public ObservableCollection<CalculatedData> CalculatedData
{
get { return calculatedData; }
set
{
calculatedData = value;
}
}XAML:
<DataGrid Name="dataGrid" ItemsSource="{Binding CalculatedData}" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />发布于 2015-08-02 05:30:01
如果你简单地做了:
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
calculatedData = await CalculateData();
dataGrid1.ItemsSource = calculatedData;
}看起来不错。我猜您的XAML绑定可能不起作用,因为没有定义DataContext。
编辑:这是完整的代码,
MainWindow:
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:
<Grid>
<DataGrid x:Name="dataGrid1" Margin="0" />
</Grid>结果:

编辑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);
}
}发布于 2015-08-02 05:40:04
每次尝试从CalculateData()的结果中添加项时,都要替换项源;
var data = await CalculateData();
foreach(var d in data)
calculatedData.Add(d);还不确定是否在构造函数中初始化了CalculatedData属性init。
CalculatedData = new ObservableCollection<yourType>();如果这有用的话请告诉我。
https://stackoverflow.com/questions/31768551
复制相似问题