如何使用 UWP 和 MVVM Light 刷新 Telerik 数据网格
How to refresh a Telerik datagrid using UWP and MVVM Light
感谢您的光临。
我在单击“刷新”按钮时无法刷新 Telerik 网格。换句话说,如果用户更改了数据并决定不保存它,单击刷新按钮应该使用原始值重新加载网格。
这是我在刷新视图中的 XAML:
<Button Content="Refresh" Grid.Row="1" Margin="92,5,0,11" Command="{x:Bind ViewModel.RefreshDataCommand}"/>
这是我在网格视图中的 XAML:
<tg:RadDataGrid ColumnDataOperationsMode="Flyout" x:Name="grid" ItemsSource="{Binding Source,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedItem="{x:Bind ViewModel.CurrentUserData, Mode=TwoWay}" UserEditMode="Inline" Grid.ColumnSpan="4" Grid.Row="1" AutoGenerateColumns="False">
请注意,在上面的代码中,网格绑定到 ViewModel 中的源 属性。这是 ViewModel 中的绑定 属性:
public ObservableCollection<UserData> Source
{
get
{
try
{
udCol = GetUserData(FileName).Result;
return udCol;
}
catch (AggregateException ex)
{
return null;
}
}
set
{
udCol = value;
}
}
以上属性在页面导航到时自动加载网格中的数据。
刷新按钮绑定的函数如下:
private void RefreshDataCommandAction()
{
udCol[0].Name = "test1";
CurrentUserData = udCol[0];
Source = udCol;
RaisePropertyChanged("Source");
}
我在上面的函数中进行了试验,这就是代码看起来多余的原因,但无论我做什么,这个函数中的新赋值都不会更新 UI。理想情况下,用户将更新 UI 中的单元格并单击“刷新”返回原始数据或重新加载数据。 ViewModel 继承了包含 INotifyPropertyChanged 的 ViewModelBase,我认为这应该足以在 属性 更改时将更改传播到 UI。我不想为了更新 UI.
而破坏 MVVM 模式
非常感谢您的帮助。提前致谢!!!
编辑:
我将视图中的 XAML 改回了这个,因为它破坏了我的 ADD 功能:
<tg:RadDataGrid ColumnDataOperationsMode="Flyout" x:Name="grid" ItemsSource="{x:Bind ViewModel.Source}" SelectedItem="{x:Bind ViewModel.CurrentUserData, Mode=TwoWay}" UserEditMode="Inline" Grid.ColumnSpan="4" Grid.Row="1" AutoGenerateColumns="False">
源未实现更改通知,因此 UI 无法知道您分配了不同的实例。
在 MVVM 中绑定任何形式的列表时,3 个部分需要更改通知:
- 属性 您在(来源)
上公开列表
- 列表本身(可观察集合负责处理)
- 您公开的类型的每个 属性(UserData 的每个 属性)
感谢您的光临。
我在单击“刷新”按钮时无法刷新 Telerik 网格。换句话说,如果用户更改了数据并决定不保存它,单击刷新按钮应该使用原始值重新加载网格。
这是我在刷新视图中的 XAML:
<Button Content="Refresh" Grid.Row="1" Margin="92,5,0,11" Command="{x:Bind ViewModel.RefreshDataCommand}"/>
这是我在网格视图中的 XAML:
<tg:RadDataGrid ColumnDataOperationsMode="Flyout" x:Name="grid" ItemsSource="{Binding Source,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedItem="{x:Bind ViewModel.CurrentUserData, Mode=TwoWay}" UserEditMode="Inline" Grid.ColumnSpan="4" Grid.Row="1" AutoGenerateColumns="False">
请注意,在上面的代码中,网格绑定到 ViewModel 中的源 属性。这是 ViewModel 中的绑定 属性:
public ObservableCollection<UserData> Source
{
get
{
try
{
udCol = GetUserData(FileName).Result;
return udCol;
}
catch (AggregateException ex)
{
return null;
}
}
set
{
udCol = value;
}
}
以上属性在页面导航到时自动加载网格中的数据。
刷新按钮绑定的函数如下:
private void RefreshDataCommandAction()
{
udCol[0].Name = "test1";
CurrentUserData = udCol[0];
Source = udCol;
RaisePropertyChanged("Source");
}
我在上面的函数中进行了试验,这就是代码看起来多余的原因,但无论我做什么,这个函数中的新赋值都不会更新 UI。理想情况下,用户将更新 UI 中的单元格并单击“刷新”返回原始数据或重新加载数据。 ViewModel 继承了包含 INotifyPropertyChanged 的 ViewModelBase,我认为这应该足以在 属性 更改时将更改传播到 UI。我不想为了更新 UI.
而破坏 MVVM 模式非常感谢您的帮助。提前致谢!!!
编辑:
我将视图中的 XAML 改回了这个,因为它破坏了我的 ADD 功能:
<tg:RadDataGrid ColumnDataOperationsMode="Flyout" x:Name="grid" ItemsSource="{x:Bind ViewModel.Source}" SelectedItem="{x:Bind ViewModel.CurrentUserData, Mode=TwoWay}" UserEditMode="Inline" Grid.ColumnSpan="4" Grid.Row="1" AutoGenerateColumns="False">
源未实现更改通知,因此 UI 无法知道您分配了不同的实例。
在 MVVM 中绑定任何形式的列表时,3 个部分需要更改通知:
- 属性 您在(来源) 上公开列表
- 列表本身(可观察集合负责处理)
- 您公开的类型的每个 属性(UserData 的每个 属性)