2008-11-17 31 views
14

Tôi có một điều khiển người dùng trong đó XAML của điều khiển có thể liên kết với các thuộc tính thích hợp từ bối cảnh dữ liệu của cha mẹ như bình thường (ngữ cảnh dữ liệu truyền trong xaml).DataContext của WPF User Control là Null

Ví dụ: tôi có một cửa sổ có DataContext mà tôi đang đặt thành ObjectA chẳng hạn. Sau đó, điều khiển người dùng của tôi trong cửa sổ sẽ cố gắng truy cập các thuộc tính trong dataContext

Vì vậy, xaml và mã của cửa sổ phía sau cả hai có thể nhìn thấy một DataContext không null.

Điều khiển của tôi mà DataContext truyền đến có thể thấy một DataContext không null trong Xaml nhưng không nằm trong mã phía sau.

Cách xử lý đúng cách này là gì?

Trả lời

19

thất bại rằng nếu bạn cần phải kiểm tra xem các DataContext đang được thiết lập, bạn có thể sử dụng DataContextChanged

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged); 
    } 

    void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     // You can also validate the data going into the DataContext using the event args 
    } 
} 

Lưu ý nó wont nhập UserControl1_DataContextChanged đến DataContext được thay đổi từ null tới một giá trị khác nhau.

Không chắc chắn nếu điều này trả lời câu hỏi của bạn nhưng có thể khá tiện dụng để sử dụng trong các vấn đề gỡ lỗi.

+1

Tôi đã phải đăng ký với sự kiện DataContextChanged trước khi InitializeComponent để tôi có thể xử lý sự kiện lần đầu tiên DataContext được thiết lập. – Darlene

+0

Cũng hoạt động: DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

Tôi nghĩ bạn đang kiểm tra 'DataContext' trong hàm tạo của UserControl. Nó sẽ được null tại Constructor vì điều khiển người dùng vẫn chưa được tạo trong khi thực thi nằm trong mã của hàm tạo. Nhưng kiểm tra thuộc tính tại sự kiện Loaded bạn sẽ thấy đối tượng đúng cách.

public partial class UserControl1 
{ 
    public UserControl1() 
    { 
     this.InitializeComponent(); 

     //DataContext will be null here 
     this.Loaded += new RoutedEventHandler(UserControl1_Loaded); 
    } 

    void UserControl1_Loaded(object sender, RoutedEventArgs e) 
    { 
     //Check DataContext Property here - Value is not null 
    } 
} 
+0

noope. Tôi đang kiểm tra nó trong bối cảnh của lớp học. –

+0

Không chắc chắn nếu bất cứ điều gì đã thay đổi kể từ câu trả lời này - nhưng sự kiện được tải có ngữ cảnh NULL. – Pakk

+0

Trong chương trình của tôi (Khuôn khổ .NET 4.6.2), DataContext trong thực tế được khởi tạo sau khi thực thi InitializeComponent. – blearyeye

10

Tôi sẽ kiểm tra xem liệu bạn có gặp lỗi ràng buộc khi chạy hay không. Thêm không gian tên này vào XAML của bạn:

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System" 

và kiểm tra cửa sổ đầu ra của trình gỡ lỗi cho thông báo lỗi có liên quan.

Ngoài ra, bạn có thể hiển thị thêm mã cho chúng tôi không?

+1

Cảm ơn bạn ... điều này thật ngọt ngào ... Tôi ước gì tôi đã tìm thấy tuần này trước ... lol. –

+0

Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn .... ngày == lưu –

+0

Vui vì nó đã tạo nên sự khác biệt lớn. Và cảm ơn cho upvote. – hughdbrown

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