c# MVVM 如何刷新 ViewModel 中的数据网格项目源
c# MVVM how to refresh datagrid itemsource in the ViewModel
我是 C# 和 MVVM 的初学者。
我有一个数据网格,我尝试使用按钮命令来刷新它。但它不起作用。
我的XAML代码
<DataGrid ItemsSource="{Binding Src_ListeApplicationARV, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsReadOnly="true" x:Name="Dt_ListeApplicationARV">
<Button Name="btn_synchro"
Style="{StaticResource MaterialDesignFloatingActionLightButton}"
Command="{Binding SynchroCommand}"
materialDesign:ButtonProgressAssist.IsIndicatorVisible="{Binding IsSaving}"
materialDesign:ButtonProgressAssist.IndicatorForeground="DarkGoldenrod"
materialDesign:ButtonProgressAssist.Value="{Binding SaveProgress}"
Width="35" HorizontalAlignment="Left" Margin="39,4,0,5" Cursor="Hand" Grid.Column="1" Height="35" Background="Transparent" BorderBrush="#6D92A0">
<!-- simple example of toggling/animating pack icon with a data trigger-->
<materialDesign:PackIcon Height="18" Width="19" Background="Transparent" Foreground="#6D92A0">
<materialDesign:PackIcon.Style>
<Style TargetType="materialDesign:PackIcon">
<Setter Property="Kind" Value="CloudSyncOutline" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsSaveComplete}" Value="false">
<Setter Property="Kind" Value="CloudSyncOutline" />
</DataTrigger>
<DataTrigger Binding="{Binding IsSaveComplete}" Value="True">
<Setter Property="Kind" Value="Check" />
<DataTrigger.EnterActions>
<BeginStoryboard Name="synchroboard">
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.8" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</materialDesign:PackIcon.Style>
</materialDesign:PackIcon>
</Button>
我的代码在后面
public ListeLogiciels()
{
InitializeComponent();
DataContext = new ListeLogicielsViewModel();
}
视图模型
public class ListeLogicielsViewModel : ViewModelBase
{
public ICommand SynchroCommand { get; }
public List<Models.ApplicationClient> Src_ListeApplicationARV
{
get { return LoadApplications(); }
set
{
Src_ListeApplicationARV = LoadApplications();
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("");
}
public ListeLogicielsViewModel()
{
var Dt_ListeApplicationARV = this.LoadApplications();// get data in a list
SynchroCommand = new AnotherCommandImplementation(_ =>
// reload dataSource
);
}
如何使用这个 Dt_ListeApplicationARV 设置我的数据网格视图?这只是一个愚蠢的代码,我被阻止了。
感谢您的帮助。
我正在尝试重新加载 viewModel 中的数据网格。
在 WPF 中,当您想要将列表显示为控件的 ItemsSource 时,您需要使用 ObservableCollection 而不是 List。它和 List 一样是可枚举的,但它 auto-handle NotifyCollectionChanged 事件。
替换
public List<Models.ApplicationClient> Src_ListeApplicationARV
{
get { return LoadApplications(); }
set
{
Src_ListeApplicationARV = LoadApplications();
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("");
}
由
public ObservableCollection<Models.ApplicationClient> Src_ListeApplicationARV {get; set;}
不要忘记在构造函数中实例化 ObservableCollection。
有了这个,您只需在视图模型中向 Src_ListeApplicationARV
添加或删除项目,它会自动在 UI.
中进行更改
OnPropertyChanged() 必须用于 属性 而不是集合。
示例:
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
抱歉我的英语不好,我是法国开发人员。
我是 C# 和 MVVM 的初学者。
我有一个数据网格,我尝试使用按钮命令来刷新它。但它不起作用。
我的XAML代码
<DataGrid ItemsSource="{Binding Src_ListeApplicationARV, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
IsReadOnly="true" x:Name="Dt_ListeApplicationARV">
<Button Name="btn_synchro"
Style="{StaticResource MaterialDesignFloatingActionLightButton}"
Command="{Binding SynchroCommand}"
materialDesign:ButtonProgressAssist.IsIndicatorVisible="{Binding IsSaving}"
materialDesign:ButtonProgressAssist.IndicatorForeground="DarkGoldenrod"
materialDesign:ButtonProgressAssist.Value="{Binding SaveProgress}"
Width="35" HorizontalAlignment="Left" Margin="39,4,0,5" Cursor="Hand" Grid.Column="1" Height="35" Background="Transparent" BorderBrush="#6D92A0">
<!-- simple example of toggling/animating pack icon with a data trigger-->
<materialDesign:PackIcon Height="18" Width="19" Background="Transparent" Foreground="#6D92A0">
<materialDesign:PackIcon.Style>
<Style TargetType="materialDesign:PackIcon">
<Setter Property="Kind" Value="CloudSyncOutline" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsSaveComplete}" Value="false">
<Setter Property="Kind" Value="CloudSyncOutline" />
</DataTrigger>
<DataTrigger Binding="{Binding IsSaveComplete}" Value="True">
<Setter Property="Kind" Value="Check" />
<DataTrigger.EnterActions>
<BeginStoryboard Name="synchroboard">
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.8" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</materialDesign:PackIcon.Style>
</materialDesign:PackIcon>
</Button>
我的代码在后面
public ListeLogiciels()
{
InitializeComponent();
DataContext = new ListeLogicielsViewModel();
}
视图模型
public class ListeLogicielsViewModel : ViewModelBase
{
public ICommand SynchroCommand { get; }
public List<Models.ApplicationClient> Src_ListeApplicationARV
{
get { return LoadApplications(); }
set
{
Src_ListeApplicationARV = LoadApplications();
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("");
}
public ListeLogicielsViewModel()
{
var Dt_ListeApplicationARV = this.LoadApplications();// get data in a list
SynchroCommand = new AnotherCommandImplementation(_ =>
// reload dataSource
);
}
如何使用这个 Dt_ListeApplicationARV 设置我的数据网格视图?这只是一个愚蠢的代码,我被阻止了。 感谢您的帮助。
我正在尝试重新加载 viewModel 中的数据网格。
在 WPF 中,当您想要将列表显示为控件的 ItemsSource 时,您需要使用 ObservableCollection 而不是 List。它和 List 一样是可枚举的,但它 auto-handle NotifyCollectionChanged 事件。
替换
public List<Models.ApplicationClient> Src_ListeApplicationARV
{
get { return LoadApplications(); }
set
{
Src_ListeApplicationARV = LoadApplications();
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("");
}
由
public ObservableCollection<Models.ApplicationClient> Src_ListeApplicationARV {get; set;}
不要忘记在构造函数中实例化 ObservableCollection。
有了这个,您只需在视图模型中向 Src_ListeApplicationARV
添加或删除项目,它会自动在 UI.
OnPropertyChanged() 必须用于 属性 而不是集合。
示例:
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
抱歉我的英语不好,我是法国开发人员。