【问题标题】:Set a label in a user control to inherit from a Parent form value using MVVM?在用户控件中设置标签以使用 MVVM 从父表单值继承?
【发布时间】:2013-01-03 15:33:31
【问题描述】:

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

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

这很好用,但我正在设置一个用户控制视图及其各自的视图模型代码。我对 ViewModel 绑定方法没有了解的是如何绑定构造函数的传入值?或者你能做到吗?或者我应该为我的“模型”而是为“DataAccess”设置一个中间类?

我的最终目标是在组合框中选择一个值,该值已经正确绑定并且运行良好,并将其传递给视图模型代码,然后在构建时与视图关联并停靠在父窗体中。我可以很好地制作一个构造函数并设置一个静态值以在它构建时显示一个名称。我不知道您如何从组合框的父视图对象传递值,该组合框绑定到用户控件的结果创建。我准备做很多事情,但我真的想坚持使用 MVVM 方法,而不是在我已经知道如何执行此操作的代码中执行此操作。

我大致遵循的MVVM方法在这里:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

【问题讨论】:

  • > 如何为构造函数绑定传入的值?这个不清楚,VM构造函数、POCO构造函数还是控件的标签构造函数?
  • 这本质上是我的问题。如何将传入的值从父 ViewModel 绑定到 UserControl(子)的 ViewModel 的构造函数?我愿意为父母使用中间代码传递给它,它构建并设置,孩子也可以绑定到它。
  • 视图模型是在哪里创建的?当我在代码隐藏中创建视图模型并将其绑定到数据上下文时,这些值将被传入。
  • 这也是我对 MVVM 方法感到困惑的原因。我总是假设在资源字典中,此过程与此类似:
  • 可以通过这种方式或在后面的代码中创建对象。由于您有特殊需求,我会在后面的代码中创建它,并在创建后将其应用于数据上下文。我从事的 Silverlight/WPF 项目就是这样做的。如果视图的构造函数在其构造函数上创建 VM,则不会违反 MVVM。

标签: c# wpf mvvm


【解决方案1】:

好的,我明白了。示例中的 MainViewModel 包含私有方法,它们是后续用户控件的构造函数。主窗口很好地绑定到组合框,但需要更多关于组合框成员的详细信息,它需要与新的构造函数相关联。这需要设置并绑定到绑定到组合框的 XAML“选定值”中的元素的属性。一旦这个属性知道它被绑定了,它就可以稍后在 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 View Model 的 MainViewModel 中的构造函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2020-02-09
    • 2012-04-01
    • 1970-01-01
    • 2010-11-25
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多