2009-10-05 34 views
26

Tôi muốn có thể tạo một đối tượng của đối tượng DataContext cho cửa sổ WPF StartupUri của tôi trong XAML, trái ngược với việc tạo mã và sau đó đặt thuộc tính DataContext lập trình.Làm thế nào để khởi tạo đối tượng DataContext trong XAML

Lý do chính là tôi không cần phải truy cập đối tượng được tạo ra bên ngoài và tôi không muốn phải viết mã phía sau chỉ để đặt DataContext.

tôi chắc chắn rằng tôi đã đọc ở đâu đó như thế nào để nhanh chóng các đối tượng DataContext trong XAML nhưng tôi không thể tìm thấy nó trong bất kỳ vị trí thông thường ...

Trả lời

31

Bạn thêm một không gian tên XML cho bất cứ điều gì không gian tên của bạn DataContext sống trong, tạo ra một thể hiện của nó trong Tài nguyên cửa sổ và đặt DataContext để tài nguyên đó:

<Window x:Class="WpfApplication4.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication4" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <local:MyViewModel x:Key="MyViewModel"/> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource MyViewModel}"> 

    </Grid> 
</Window> 
+0

Tính năng này có hoạt động trong .NET framework 4.5 không? Tôi đã thử mã này và nó nói ... 'Loại 'cục bộ: MyViewModel' không được tìm thấy. Xác minh rằng bạn không bỏ lỡ một hội đồng và tất cả các hội đồng được tham chiếu đã được xây dựng.' –

+0

@RafafTahsin bạn có đảm bảo rằng bạn đã có đúng không gian tên không? Ngoài ra, nếu bạn đã thêm kiểu tham chiếu vào dự án nhưng chưa được xây dựng, trình thiết kế WPF sẽ hơi bối rối. Bạn đã thử xây dựng chưa? – Randolpho

27

Bạn chỉ có thể chỉ định này trực tiếp trong XAML cho toàn bộ cửa sổ:

<Window 
    ... xmlns definitions ... 
> 
    <Window.DataContext> 
     <local:CustomViewModel /> 
    </Window.DataContext> 
</Window> 

Điều này tạo ra một mô hình khung nhìn có tên là "CustomViewModel" trong không gian tên được đặt tên cho địa phương, trực tiếp dưới dạng DataContext cho Cửa sổ.

15

Giả sử mã này:

public abstract class BaseView { } 
public class RuntimeView : BaseView { } 
public class DesigntimeView : BaseView { } 

Hãy thử điều này:

<Page.DataContext> 
    <local:RuntimeView /> 
</Page.DataContext> 
<d:Page.DataContext> 
    <local:DesigntimeView /> 
</d:Page.DataContext> 
<ListBox ItemsSource="{Binding}" /> 

Best of luck!

+1

+1 bởi vì điều này cho thấy cả chạy và designtime, và không sử dụng x: Key nhưng thay vào đó đặt DataContext trực tiếp trong phần tử mà nó thuộc về – stijn

0

Nếu bạn cần phải thiết lập các DataContext như lớp kiểm soát giống nhau:

<Window x:Class="TabControl.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
      xmlns:local="clr-namespace:TabControl" 
      Title="MainWindow" Height="350" Width="525" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"   
      > 
</Window> 

sử dụng ràng buộc RelativeSource.

hoặc chỉ

 <Window x:Class="TabControl.MainWindow" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
       xmlns:local="clr-namespace:TabControl" 
       Title="MainWindow" Height="350" Width="525"       
       > 
<Window.DataContext> 
< new instance of any viewModel here....> 
</Window.DataContext> 
    </Window> 

Nếu muốn gán một thể hiện của lớp khác so với chính nó.

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