0

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

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

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

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

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

4

1 回答 1

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 View Model 的 MainViewModel 中的构造函数:

    void MoneyEntry()
    {
        SetCurrentUser();
        MoneyEntryViewModel money = new MoneyEntryViewModel(_currentPerson);
        this.Workspaces.Add(money);
        this.SetActiveWorkspace(money);
    }
于 2013-01-08T05:14:48.713 回答