わかった。この例の MainViewModel には、後続のユーザー コントロールのコンストラクターであるプライベート メソッドが含まれています。メイン ウィンドウはコンボボックスに正常にバインドされますが、新しいコンストラクターに関連付ける必要があるコンボボックスのメンバーの詳細が必要です。これを設定し、コンボボックスの XAML 'selected value' の要素にバインドされたプロパティにバインドする必要があります。このプロパティがバインドされていることを認識すると、後でデータバインドされた ViewModelCode の内部メソッドで使用して、渡された Person オブジェクトが必要なものをコンストラクターに通知できます。
私と同じような状況の人がたくさんいますが、違う人がいるので、後で役に立つと思う人がいれば投稿したいと思います. 私が追加する唯一の言葉は、「INotifyPropertyChanged」クラスを継承する必要があると信じているということですが、私の例では、抽象クラスで2クラスの継承レベルが下がっているため、より単純な例を示すためにすべてをやり直す必要はないと感じました。必要なものを手に入れました。
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);
}