2008-11-17 47 views
14

我有一個用戶控件,其中控件的XAML可以像正常情況(數據上下文在xaml中傳播)一樣綁定到來自父級數據上下文的相應屬性。WPF用戶控件的DataContext爲空

例如,我有一個窗口,其DataContext我設置爲ObjectA爲例。然後,我在窗口中的用戶控件嘗試訪問dataContext中的屬性。因此,我的窗口的xaml和後面的代碼都可以看到非空的DataContext。

DataContext傳播給我的控件可以在Xaml中看到非空的DataContext,但在後面的代碼中看不到。

處理此問題的正確方法是什麼?

回答

19

做不到這一點,如果你需要檢查的DataContext是否被設置就可以使用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 
    } 
} 

注意,直到DataContext的從空轉變爲不同的值,它不會進入UserControl1_DataContextChanged。

不確定這是否回答您的問題,但在調試問題中使用起來可能非常方便。

11

我想你正在檢查UserControl的構造函數中的'DataContext'。它將在構造函數中爲空,因爲用戶控件尚未在構造函數代碼中執行時創建。但請檢查Loaded事件中的屬性,您將正確看到對象。

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

不需要。我正在課堂上檢查它。 – 2008-11-17 22:56:22

+0

不知道自此答案以來是否有任何更改 - 但Loaded事件的上下文爲NULL。 – Pakk 2016-04-09 03:20:21

+0

在我的程序(.NET Framework 4.6.2)中,DataContext實際上是在InitializeComponent執行後初始化的。 – blearyeye 2017-12-20 20:39:11

10

我會檢查您是否在運行時出現綁定錯誤。將此命名空間添加到您的XAML中:

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

並檢查調試器的Output窗口中的相關錯誤消息。

另外,你能告訴我們更多的代碼嗎?