2017-02-06 24 views
0

У меня есть модель представления, в которой есть команда, в которой отображается новое окно (у которого есть собственная модель представления). Модель просмотра нового окна имеет различные свойства, и когда я закрываю новое окно, я хочу передать эти свойства обратно в первую модель представления, которая ее вызвала.Получить значения свойств из другой модели представления при закрытии окна

Я разрушаю шаблон MVVM здесь, так как просто казалось, что быстрее и проще показать новое окно с помощью ShowDialog(). Вот пример моего кода:

MainViewModel:

//Note: The OnPropertyChanged and CanExecute functions are implemented 

//method via command to show a new window 
private void ShowSYOWindow(object parameter) 
{ 
    SYOWindow syo = new SYOWindow(); 
    syo.ShowDialog(); 
} 
вид модели

Нового окна:

class SYOWindowViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged;  

    private DateTime _timeStart; 
    public DateTime TimeStart 
    { 
     get { return _timeStart; } 
     set { _timeStart = value; OnPropertyChanged("TimeStart"); } 
    } 

    private DateTime _timeStart2; 
    public DateTime TimeStart2 
    { 
     get { return _timeStart2; } 
     set { _timeStart2 = value; OnPropertyChanged("TimeStart2"); } 
    } 

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

Вот код-за для SYOWindow:

using Proj1.ViewModels; //viewmodel located in different folder in project 
public partial class SYOWindow : Window 
{ 
    public SYOWindowViewModel vm => (SYOWindowViewModel)DataContext; //error here 

    public SYOWindow() 
    { 
     InitializeComponent(); 
    } 

    private void OKBtn_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
    } 

    private void CancelBtn_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = false; 
    } 
} 

Таким образом, после Я открываю новое окно с 'syo.ShowDialog()' из MainViewModel, и я установил некоторые свойства в SYOWindo wViewModel для окна syo, я хочу вернуть эти свойства в MainViewModel. Я не могу понять, что такое «правильный» и самый чистый способ сделать это. Я читал, что могу использовать DataContext, а затем получать значения таким образом, но это кажется неправильным. Но, возможно, единственный способ, с которого я разбил MVVM, используя showdialog.

ответ

1

ShowDialog() блоки, так что вы можете просто родитель взять вещи из ViewModel ребенка после ShowDialog() выходов:

private void ShowSYOWindow(object parameter) 
{ 
    SYOWindow syo = new SYOWindow(); 
    syo.ShowDialog(); 

    var vm = (SYOWindowViewModel)syo.DataContext; 

    this.Foo = vm.Foo; 
} 

вы можете упростить код немного, если вы даете SYOWindow на ViewModel недвижимость:

public partial class SYOWindow : Window 
{ 
    // ...stuff 

    // C#6 version -- but if you're on an earlier version of C#, you'll get 
    // "DataContext is a property but is used like a type" and a red squiggly. 
    //public SYOWindowViewModel ViewModel => (SYOWindowViewModel)DataContext; 

    // C#<=5. This works fine in C#6 as well. 
    public SYOWindowViewModel vm { get { return (SYOWindowViewModel)DataContext; } } 

    // ...more stuff 
} 

Тогда родитель может просто сделать так:

private void ShowSYOWindow(object parameter) 
{ 
    SYOWindow syo = new SYOWindow(); 

    syo.ShowDialog(); 

    this.Foo = syo.ViewModel.Foo; 
} 

И если SYOWindow использует its DialogResult property, вы можете делать такие вещи, как это:

private void ShowSYOWindow(object parameter) 
{ 
    SYOWindow syo = new SYOWindow(); 

    if (syo.ShowDialog().GetValueOrDefault()) 
    { 
     this.Foo = syo.ViewModel.Foo; 
    } 
} 
+0

Спасибо! Просто интересно, как второй фрагмент кода, который вы опубликовали, упрощает код, предоставляя окну свойство viewmodel? – pfinferno

+0

О, не обращай внимания, я вижу сейчас. Спасибо за предложение! Перейдя также в свойство dialogresult. – pfinferno

+0

Не удалось получить 'public SYOWindowViewModel ViewModel => (SYOWindowViewModel) DataContext;' работать правильно. Говорит, что DataContext не может использоваться как тип. – pfinferno

1

выполнение ShowDialog(); блоков, пока диалог не будет закрыт, поэтому все, что вам нужно сделать, это:

form.ShowDialog(); 
var myVar = form.myVar;