好的,我明白了。示例中的 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);
}