使用MVVM将用户控件中的标签设置为从父窗体值继承

本文关键字:窗体 继承 设置 标签 MVVM 用户 控件 使用 | 更新日期: 2023-09-27 17:50:45

MVVM方法的WPF问题指定。我在XAML的MainView中有一个组合框。它的代码伙伴是'MainViewModel',并公开了一个'Person'的属性,这基本上只是一个单独的类(POCO类),用于公开字符串和int来表示数据库中的名称和种子。它设置了一个ReadOnlyCollection的属性,绑定到一个组合框,如下所示:(引用xaml顶部的视图模型,如:xmlns:vm="clr-namespace:(mylocationforviewmodelnamespace))

ItemsSource="{Binding Path=People}"
                    DisplayMemberPath="FirstName"
                    SelectedValuePath="PersonId"

这工作得很好,但我然后设置一个用户控制视图和它各自的视图模型代码。关于绑定的ViewModel方法,我不明白的是如何为构造函数绑定传入的值?或者你能做到吗?或者我应该设置一个中介类,不仅为我的"模型",但为"数据访问"?

我的最终目标是在一个组合框中选择一个值,它已经被正确地绑定并且工作得很好,并将它传递给视图模型代码,然后在构建和停靠在父窗体中时与视图关联。我可以创建一个构造函数,并设置一个静态值,以便在构建时显示名称。我不知道你是如何传递一个组合框的父视图对象的值,它被绑定到usercontrol的结果创建。我准备做很多事情,但我真的想坚持MVVM方法,而不是在我已经知道如何做到这一点的代码中做这件事。

MVVM方法我松散地遵循在这里:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

使用MVVM将用户控件中的标签设置为从父窗体值继承

好的,我知道了。示例中的MainViewModel包含私有方法,这些方法是后续用户控件的构造函数。主窗口可以很好地绑定到组合框,但是需要更多关于组合框成员的细节,它需要关联到一个新的构造函数。这需要设置并绑定到一个属性,该属性绑定到组合框的XAML 'selected value'中的元素。一旦这个属性知道它被绑定了,它就可以在ViewModelCode的内部方法中使用,该方法是绑定的,以通知构造函数传入的Person对象需要是什么。

我看到很多人的情况与我相似,但不同,所以我想我将张贴这如果有人可能会发现它有用。我要补充的唯一一句话是,我相信你需要继承"INotifyPropertyChanged"类,但在我的例子中,它是在一个抽象类两个类的继承水平下降,所以我觉得没有必要重做一切来显示一个更简单的例子,因为我得到了我需要的。

XAML:

<ComboBox Height="30" Width="170" Margin="10" x:Name="combopersons" 
                    FontSize="20"
                    ItemsSource="{Binding Path=People}"
                    DisplayMemberPath="FirstName"
                    SelectedValuePath="PersonId"
                    SelectedValue="{Binding Path=CurrentUser}"  />

字段:

Person _currentPerson;
        ReadOnlyCollection<Person> _people;
        ObservableCollection<WorkspaceViewModel> _workspaces;
        string _curuser;
        string u = WindowsIdentity.GetCurrent().Name.Split('''')[1];
        public string CurrentUser { get; set; }
        ExpensesEntities ee = new ExpensesEntities();
public ReadOnlyCollection<Person> People
        {
            get
            {
                if (_people == null)
                {
                    List<Person> persns = this.GetPeople();
                    _people = new ReadOnlyCollection<Person>(persns);
                }
                return _people;
            }
        }
构造函数:

public MainWindowViewModel()
        {
            _curuser = ee.tePersons.Where(n => n.FirstName == u)
                        .Select(x => x.PersonID).FirstOrDefault().ToString();
            CurrentUser = _curuser;
        }

辅助方法:

        List<Person> GetPeople()
        {
            //ExpensesEntities ee = new ExpensesEntities();
            return ee.tePersons.Select(x => new Person
                                         {
                                             PersonId = x.PersonID,
                                             FirstName = x.FirstName
                                         }).ToList();
        }

int ConvertToNumber(string s)
        {
            try
            {
                return Convert.ToInt32(s);
            }
            catch (FormatException e)
            {
                return 0;
            }
        }
        void SetCurrentUser()
        {
            int currentID = ConvertToNumber(CurrentUser);
            _currentPerson = ee.tePersons
                               .Where(i => i.PersonID == currentID)
                               .Select(p => new Person
                                                {
                                                    PersonId = p.PersonID,
                                                    FirstName = p.FirstName
                                                }).FirstOrDefault();
        }

CHILD视图模型的MainViewModel中的构造函数:

    void MoneyEntry()
    {
        SetCurrentUser();
        MoneyEntryViewModel money = new MoneyEntryViewModel(_currentPerson);
        this.Workspaces.Add(money);
        this.SetActiveWorkspace(money);
    }