使用OnNavigatedTo方法将Combobox绑定为空

时间:2017-11-10 10:43:50

标签: c# wpf mvvm prism

我很擅长使用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是正确的方法吗?或者我错过了什么。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的第一种方法是错误的,因为您没有调用RaisePropertyChanged。 在构造函数上,您将为Customers属性分配一个新的空列表,以便组合框开始为空。

第二次,在OnNavigatedTo方法上,您将填充的列表分配给Customers属性,但Customers属性不会调用RaisePropertyChanged,因此视图将不会知道更改。

你可以像第二种方法一样修复它,这是一种正确的方法。

另一种解决方案是只在构造函数上填充列表而不是在OnNavigatedTo上填充它,在这种情况下,Customers属性不需要调用RaisePropertyChanged,因为视图将使用更新的元素构建。

但只有当您在View中时才会更改Customers属性,这才有意义。