C# 如何在ItemSource更改时重新加载UWP数据网格
UWP数据网格: 以下是xaml:C# 如何在ItemSource更改时重新加载UWP数据网格,c#,mvvm,uwp,prism,C#,Mvvm,Uwp,Prism,UWP数据网格: 以下是xaml: <controls:DataGrid x:Name="dg_Users" AlternatingRowBackground="Gainsboro" AutoGenerateColumns="False" BorderThickness="1" CanUserResizeColumns="False" GridLinesVisibilit
<controls:DataGrid x:Name="dg_Users"
AlternatingRowBackground="Gainsboro"
AutoGenerateColumns="False"
BorderThickness="1"
CanUserResizeColumns="False"
GridLinesVisibility="Horizontal"
IsReadOnly="True"
ItemsSource="{Binding UserSource, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
绑定属性:
private ObservableCollection<User> _userSource;
public ObservableCollection<User> UserSource {
get { return _userSource; }
set { SetProperty(ref _userSource, value); }
}
private observeCollection\u userSource;
公共ObservableCollection用户源{
获取{return\u userSource;}
set{SetProperty(ref_userSource,value);}
}
方法:
//called on constructor
private async void LoadData() {
UserSource = new ObservableCollection<User>();
var users = await sqlService.AllUsers();
if(users != null) {
foreach (var item in users) {
UserSource.Add(item);
}
}
}
//在构造函数上调用
私有异步void LoadData(){
UserSource=新的ObservableCollection();
var users=await sqlService.AllUsers();
如果(用户!=null){
foreach(用户中的var项){
UserSource.Add(item);
}
}
}
例如,datagrid将显示3个项目,然后我做了一些更改,例如添加了新项目或删除了1个项目,当我单击调用LoadData()的按钮时,UserSource已更改并包含新数据,但datagrid没有重新加载或显示新的/更新的数据,如何通过mvvm重新加载datagrid
如何在ItemSource更改时重新加载UWP数据网格
请避免在每个按钮单击时重新创建新按钮。请实现ObservableCollection对象一次,然后对其进行编辑。请检查以下代码
public class MainPageViewModel
{
public ObservableCollection<User> UserSource { get; } = new ObservableCollection<User>();
public MainPageViewModel()
{
LoadData();
}
private async void LoadData()
{
UserSource.Clear();
var users = await sqlService.AllUsers();
if (users != null)
{
foreach (var item in users)
{
UserSource.Add(item);
}
}
}
public ICommand BtnClickCommand
{
get
{
return new RelayCommand(() =>
{
UserSource.RemoveAt(0);
});
}
}
}
public类MainPageViewModel
{
public observeCollection UserSource{get;}=new observeCollection();
公共MainPageViewModel()
{
LoadData();
}
私有异步void LoadData()
{
UserSource.Clear();
var users=await sqlService.AllUsers();
如果(用户!=null)
{
foreach(用户中的var项)
{
UserSource.Add(item);
}
}
}
公共ICommand BtnClickCommand
{
得到
{
返回新的RelayCommand(()=>
{
UserSource.RemoveAt(0);
});
}
}
}
最简单的解决方案:
当my AllUsers函数返回IEnumerable时,将属性更改为IEnumerable:
private IEnumerable<User> _userSource;
public IEnumerable<User> UserSource {
get { return _userSource; }
set { SetProperty(ref _userSource, value); }
}
值得注意的是@Clemens,
UpdateSourceTrigger=PropertyChanged
对单向绑定没有任何影响。在这里设置它是没有意义的。如果您总是在LoadData中创建一个新集合,那么使用ObservableCollection也没有意义。只需创建一个新的集合实例,例如列表
,填充它,然后将其分配给UserSource属性,该属性可以是public IEnumerable UserSource{…}
。它甚至可以像UserSource=await-sqlService.alluser()一样简单
。您还应该避免使用异步void
方法,但事件处理程序除外。@Clemens我将属性的类型更改为IEnumerable,并在加载数据时使用:UserSource=await sqlService.AllUSers(),解决我的问题,谢谢
private async void LoadUserData() {
UserSource = await sqlService.AllUsers();
}