【问题标题】:Binding Up Nested UserComponent To it ViewModel将嵌套的 UserComponent 绑定到它的 ViewModel
【发布时间】:2011-07-29 05:18:30
【问题描述】:

我有一个 WFP 项目,我正在使用 MVVM 模式。 我有在 CustomerView UserControl 中使用的 AddressView 用户控件。

<my:AddressVeiw Width="340" DataContext="AddressViewModel"/>

我的 AddressVeiw userControl 有一个 AddressViewModel 并且 CustomerView 有一个 CustomerViewModel

CustomerViewModel 代码

        public DelegateCommand<object> SaveCommand { get; set; }

 
        private string firstName;

        public string FirstName
        {
            get { return firstName; }
            set { 
                firstName = value;
                RaisePropertyChanged("FirstName");
                SaveCommand.RaiseCanExecuteChanged();
            }
        }

        private string lastName;

        public string LastName
        {
            get { return lastName; }
            set { 
                lastName = value;
                RaisePropertyChanged("LastName");
                SaveCommand.RaiseCanExecuteChanged();
            }
        }
        private AddressViewModel addressViewModel;

        public AddressViewModel AddressViewModel
        {
            get { return addressViewModel; }
            set { addressViewModel = value; }
        }

        private string middleName;

        public string Middlename
        {
            get { return middleName; }
            set
            {
                middleName = value;
                RaisePropertyChanged("MiddleName");
                SaveCommand.RaiseCanExecuteChanged();
            }
        }
        private string fullName;

        public string FullName
        {
            get { return fullName; }
            set { 
                fullName = value;
                RaisePropertyChanged("FullName");
            }
        }
        
            
        private void InitializeCommands()
        {
            SaveCommand = new DelegateCommand<object>(OnSaveCommand, CanSaveExcute);
        }

        private bool CanSaveExcute(object obj)
        {
            if (string.IsNullOrEmpty(firstName) ||string.IsNullOrEmpty(lastName))
                return false;
            return true;
        }

        private void OnSaveCommand(object obj)
        {
            FullName = FirstName + " " + LastName;
        }

    }

AddressViewModel 代码

    private ObservableCollection<Country> countryList = new ObservableCollection<Country>();

    public ObservableCollection<Country> CountryList
    {
        get { return countryList; }
        set { countryList = value; }
    }

    public DelegateCommand<object> SaveCommand { get; set; }

    private void Load()
    {
        try
        {
            CountryList = (new CountryRepository().GetAll());
        }
        catch (Exception ex)
        {

            OnSetStatusBarText("Error: " + ex.Message.ToString());
        }

    }
    private void OnSetStatusBarText(string message)
    {
        var evt = eventAgg.GetEvent<StatusBarMessageEvent>();
        evt.Publish(message);
    }
    private void InitializeCommands()
    {
        SaveCommand = new DelegateCommand<object>(OnSaveCommand, CanSaveExcute);
    }
    private bool CanSaveExcute(object obj)
    {

        return true;
    }

    private void OnSaveCommand(object obj)
    {

    }

我如何将 AdddressViewModel 连接到我的 AddressView,客户工作正常... 必须做些什么来解决这个问题? 谢谢

【问题讨论】:

    标签: wpf mvvm user-controls nested viewmodel


    【解决方案1】:

    您需要为 AddressView 的 DataContext 使用绑定表达式。而不是这个...

    <my:AddressVeiw Width="340" DataContext="AddressViewModel"/>
    

    ...试试这个...

    <my:AddressVeiw Width="340" DataContext="{Binding AddressViewModel}"/>
    

    【讨论】:

    • 感谢 addressViewModel 未初始化。我该怎么办?
    • 一个简单的修复方法可能是在 CustomerViewModel 中初始化 AddressViewModel 属性。私有地址视图模型地址视图模型 = 新地址视图模型;或者,在创建 CustomerViewModel 时设置 AddressViewModel 属性。
    【解决方案2】:

    你已经接近了,但你需要一个绑定:

    <my:AddressVeiw Width="340" DataContext="{Binding AddressViewModel}"/>
    

    【讨论】:

    • 谢谢,但现在 addressViewModel 没有初始化。我该怎么办?
    • @Tau 你能解释一下“不初始化”是什么意思吗?初始化 CustomerViewModel 时是否给它一个值?
    • 我正在使用棱镜框架,构造函数看起来像这样。如何创建新实例? public AddressViewModel(IEventAggregator eventAggregator, IUnityContainer container, ILoggerFacade logger) : base(eventAggregator, container, logger){
    • 您的 CustomerViewModel 的构造函数中有依赖关系(IEventAggregator 等)吗?如果是这样,只需将它们传入:this.AddressViewModel = new AddressViewModel(eventAggregator, container, logger);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2019-12-19
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多