Ich habe eine Ansicht, die zwei Teilansichten auf sie hat und ein Ansichtsmodell ist jede Ansicht zugewiesen:Pass-Daten aus dem Code hinter und Ansichtsmodell zu einem anderen Ansichtsmodell
ViewParent - ViewModelParent
{
ViewA - ViewModelA
ViewB - ViewModelB
}
Die ViewParent
Struktur unten mag.
<StackPanel Orientation="Vertical">
<local:AView DataContext="{Binding ViewModelA, Mode=TwoWay}"></localViews:AView>
</StackPanel>
<StackPanel Orientation="Vertical">
<localViews:BView DataContext="{Binding ViewModelB, Mode=TwoWay}"></localViews:BView>
</StackPanel>
nun in Code hinter dem ViewA
, ich habe ein Ereignis eine Zeile in einem Gridview zu wählen.
private void radGridView_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
try
{
RadGridView grv = sender as RadGridView;
if (e.AddedItems.Count > 0)
{
var row = grv.SelectedItem as SomeClass;
if(condition)
// Enable a button in ViewB.
Was ich will, ist row
zu ViewModelB
passieren. Außerdem möchte ich eine Schaltfläche in ViewB aktivieren. Schließlich möchte ich ein paar ganze Zahlen von ViewModelA
bis ViewModelB
übergeben.
Wie geht das? Ich dachte über Konstruktoreinspritzung nach, aber immer noch ohne klare Vorstellung.
ViewModelParent sollte einen Verweis auf jedes Kind vm haben, richtig? Geben Sie also vmA eine SelectedRow-Eigenschaft mit 'PropertyChanged', und binden Sie diese in ViewA. Geben Sie vmA ein SelectedRowChanged-Ereignis. Erhöhen Sie es, wenn sich die ausgewählte Zeile ändert. ViewModelParent richtet einen Handler für dieses Ereignis ein, wenn er vmA erstellt, und im Handler legt er eine Eigenschaft für vmB fest, wie 'bool CanDoWhatever'. 'CanDoWhatever' aktiviert den Befehl, an den die Schaltfläche gebunden ist, und sieht, dass das CanExecuteChanged-Ereignis des Befehls ausgelöst wird. –
@EdPlunkett, ja. ViewModelParent hat einen Verweis auf jedes untergeordnete vm. Und VmA verfügt bereits über eine SelectedItem-Eigenschaft mit 'PropertyChanged'. Und ich bin mir nicht sicher, was ich in VmB alles machen kann. – Bigeyes
Tun Sie alles, was Sie mit den Werkzeugen haben müssen, die Sie haben. Vielleicht geben Sie vmB eine Eigenschaft 'bool IsMyPuppyDogButtonEnabled {get; einstellen; } 'das erhöht PropertyChanged. Lassen Sie das Eltern-vm diese Eigenschaft in XAML 'IsEnabled =" {Binding IsMyPuppyDogButtonEnabled} "und auf dem Button entsprechend setzen' '. Es gibt eine Million Möglichkeiten, es zu tun. Fazit: Viewmodels verwalten den Status untereinander. Ansichten sitzen dort, beobachten die Eigenschaften ihrer Ansichtsmodelle und reagieren auf Änderungen in diesen Eigenschaften. –