Saya telah membuat Jendela Kotak Pesan khusus untuk menggantikan Kotak Pesan yang khas.

Kotak pesan khusus saya (Jendela anak) membutuhkan jendela induk untuk diteruskan sebagai argumen. Jendela induk adalah di mana jendela anak akan ditempatkan di dalam lokasi yang ditentukan (Kiri Atas, Tengah Atas, dll.) juga sebagai argumen.

Jadi ketika memanggil kotak pesan khusus saya dari model tampilan, saya perlu mendapatkan Jendela untuk melewatinya. Bagaimana saya bisa mendapatkan Window yang terkait dengan model tampilan?

Mungkin menggunakan Antarmuka seperti yang dikomentari di sini? Saya mencoba menerapkannya tetapi this.DataContext.View tidak ada.

Saya menggunakan Visual Studio 2008.

COBA #1: solusi mm8

<Window x:Class="MyNamespace.Main"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewmodel="clr-namespace:MyNamespace.ViewModels">
    <Window.Resources>
        <viewmodel:MainViewModel x:Key="wMainViewModel" />
    </Window.Resources>

    <Grid DataContext="{StaticResource wMainViewModel}">
    </Grid>
</Window>

Mempertimbangkan bahwa saya menginisialisasi DataContext dari xaml dan bukan di belakang kode dari konstruktor, bagaimana saya bisa meneruskan tampilan ke model tampilan¿?

3
Ralph 13 November 2017, 17:05

1 menjawab

Jawaban Terbaik

Bagaimana saya bisa mendapatkan Window yang terkait dengan model tampilan?

Anda dapat menyuntikkan model tampilan dengan antarmuka yang diimplementasikan oleh jendela:

public interface IView
{
    double Top { get; }
    double Left { get; }
    double Height { get; }
    double Width { get; }
}

public partial class MainWindow : Window, IView
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel(this);
    }
}

public class ViewModel
{
    private readonly IView _view;

    public ViewModel(IView view)
    {
        _view = view;
    }

    //...
}

Kemudian model tampilan hanya tahu tentang antarmuka (yang mungkin harus disebut selain IView).

Jika Anda menginginkan pintasan yang jelek dan tidak ramah MVVM, Anda dapat menggunakan kelas Application:

var win = Application.Current.MainWindow;

Kelas pabrik untuk membuat semuanya:

public MainWindow WindowFactory()
{
    MainWindow mainWindow = new MainWindow();
    ViewModel viewModel = new ViewModel();
    mainWindow.DataContext = viewModel;

    return mainWindow;
}
8
Ignacio Soler Garcia 14 November 2017, 12:04