C# 如何在ItemSource更改时重新加载UWP数据网格

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

UWP数据网格:

以下是xaml:

<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();
    }