在用户控件中设置标签以使用MVVM从Parent表单值继承?

时间:2013-01-03 15:33:32

标签: c# wpf mvvm

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

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

这很好但我正在设置一个用户控制视图,它是各自的视图模型代码。我没有得到关于ViewModel绑定方法的是如何绑定构造函数的传入值?或者你甚至可以这样做?或者我应该设置一个中间类,不仅仅是为了我的'模型',而是为了'DataAccess'?

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

我松散地关注的MVVM方法是:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

1 个答案:

答案 0 :(得分:0)

好的,我明白了。示例中的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视图模型的MainViewModel中的构造函数:

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