使用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
好的,我知道了。示例中的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);
}