我很擅长使用Prism WPF,并对其工作原理以及如何构建应用程序有基本的了解。
我在将数据绑定到视图中的控件时遇到问题,特别是使用' OnNavigatedTo'方法。
方法1
我明白“OnNavigatedTo'在构造函数之后调用方法,但是当我调用存储库来填充Customers时,视图中的ComboBox为空。
视图模型:
public class ViewAViewModel : BindableBase, INavigationAware
{
private readonly IRegionManager _regionManager;
private readonly IRepository _repository;
public List<Customer> Customers { get; set; }
public ViewAViewModel(IRepository repository, IRegionManager regionManager)
{
_repository = repository;
_regionManager = regionManager;
Customers = new List<Customer>();
}
private string _selectedCustomer;
public string SelectedCustomer
{
get { return _selectedCustomer; }
set { SetProperty(ref _selectedCustomer, value); }
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
Customers = _repository.GetCustomers();
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
查看:
<UserControl x:Class="ModuleA.Views.ViewA"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<StackPanel>
<ComboBox ItemsSource="{Binding Customers}" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValue="{Binding SelectedCustomer}"></ComboBox>
</StackPanel>
</Grid>
</UserControl>
如果我初始化/填写&#39;客户&#39;通过构造函数,ComboBox绑定工作正常,但是,当模块被添加到Bootstrapper中的模块目录时,“客户”#39;存储库方法被不必要地调用。我认为这不太理想。
方法2
如果我使用&#39; RaisePropertyChanged&#39;在&#39; Customers&#39;上,然后将数据绑定到ComboBox工作正常。
视图模型:
public class ViewAViewModel : BindableBase, INavigationAware
{
private readonly IRegionManager _regionManager;
private readonly IRepository _repository;
private List<Customer> _customers;
public List<Customer> Customers
{
get { return _customers; }
set
{
_customers = value;
RaisePropertyChanged();
}
}
public ViewAViewModel(IRepository repository, IRegionManager regionManager)
{
_repository = repository;
_regionManager = regionManager;
_customers = new List<Customer>();
}
private string _selectedCustomer;
public string SelectedCustomer
{
get { return _selectedCustomer; }
set { SetProperty(ref _selectedCustomer, value); }
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
Customers = _repository.GetCustomers();
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
方法2是正确的方法吗?或者我错过了什么。
提前谢谢。
答案 0 :(得分:0)
您的第一种方法是错误的,因为您没有调用RaisePropertyChanged。 在构造函数上,您将为Customers属性分配一个新的空列表,以便组合框开始为空。
第二次,在OnNavigatedTo方法上,您将填充的列表分配给Customers属性,但Customers属性不会调用RaisePropertyChanged,因此视图将不会知道更改。
你可以像第二种方法一样修复它,这是一种正确的方法。
另一种解决方案是只在构造函数上填充列表而不是在OnNavigatedTo上填充它,在这种情况下,Customers属性不需要调用RaisePropertyChanged,因为视图将使用更新的元素构建。
但只有当您在View中时才会更改Customers属性,这才有意义。