2011-01-04 44 views
79

Câu hỏi khá nhiều nói lên tất cả.Làm cách nào để đặt ViewModel trên một cửa sổ trong XAML bằng cách sử dụng thuộc tính DataContext?

Tôi có một cửa sổ và đã cố gắng đặt DataContext bằng cách sử dụng không gian tên đầy đủ cho ViewModel, nhưng dường như tôi đang làm điều gì đó sai.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="BuildAssistantUI.ViewModels.MainViewModel"> 

Trả lời

90

Bên cạnh những giải pháp mà người khác được cung cấp (mà là tốt, và chính xác), có một cách để xác định ViewModel trong XAML, nhưng vẫn tách ViewModel cụ thể từ các View. Tách chúng là hữu ích cho khi bạn muốn viết các trường hợp thử nghiệm bị cô lập.

Trong App.xaml:

<Application 
    x:Class="BuildAssistantUI.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:BuildAssistantUI.ViewModels" 
    StartupUri="MainWindow.xaml" 
    > 
    <Application.Resources> 
     <local:MainViewModel x:Key="MainViewModel" /> 
    </Application.Resources> 
</Application> 

Trong MainWindow.xaml:

<Window x:Class="BuildAssistantUI.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{StaticResource MainViewModel}" 
    /> 
+0

Oh wow ... cảm ơn. Tôi đã đánh dấu phần này là đã trả lời, nhưng phần bổ sung của bạn được đánh giá cao. Sẽ sử dụng nó. – Nicholas

+0

@Nicholas: Câu trả lời khác là hoàn hảo cho câu hỏi, vì vậy tôi đồng ý với quyết định của bạn –

+0

sau đó một lần nữa ... bạn hoàn thiện hơn. Nếu ai đó truy cập bài đăng này ... – Nicholas

114

Hãy thử thay thế này.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels"> 
    <Window.DataContext> 
     <VM:MainViewModel /> 
    </Window.DataContext> 
</Window> 
+3

Tôi thích tùy chọn này là tốt nhất. Dường như sạch hơn nếu máy ảo chỉ được sử dụng cho MainWindow. –

+10

Có cách nào để thiết lập bối cảnh dữ liệu bằng cách sử dụng một thuộc tính trên phần tử 'Window', như' DataContext = "VM: MainWindowViewModel" '? – Oliver

+0

Đây là cách thích hợp! – JavierIEH

7

Bạn cần khởi tạo MainViewModel và đặt làm văn bản dữ liệu. Trong tuyên bố của bạn, nó chỉ xem xét nó như là giá trị chuỗi.

 <Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"> 
     <Window.DataContext> 
     <local:MainViewModel/> 
     </Window.DataContext> 
+0

Cảm ơn, tôi đã biết nó đang làm điều đó. – Nicholas

3

Bạn có thể muốn thử Catel. Nó cho phép bạn định nghĩa một lớp DataWindow (thay vì Window), và lớp đó sẽ tự động tạo ra mô hình khung nhìn cho bạn. Bằng cách này, bạn có thể sử dụng khai báo của ViewModel như bạn đã làm trong bài viết gốc của bạn, và mô hình khung nhìn vẫn sẽ được tạo và đặt làm DataContext.

Xem this article để biết ví dụ.

Các vấn đề liên quan