2010-05-28 61 views
3

只是學習WPF數據綁定,並在我的理解有差距。我在StackOverflow上看到過一些類似的問題,但我仍然在努力確定我做錯了什麼。WPF DataBinding在代碼隱藏中的標準CLR屬性

我有一個簡單的人類與名字和姓氏屬性(標準CLR屬性)。我的Window類中也有一個標準的CLR屬性,用於公開一個Person實例。

我已經有了一些XAML,有兩種綁定方法。第一部作品,第二部沒有。 任何人都可以幫助我理解第二種方法失敗的原因嗎?輸出日誌中沒有綁定錯誤消息。

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300" 
    DataContext="{Binding RelativeSource={RelativeSource Self}, Path=MyPerson}"> 
<StackPanel> 
    <Label>My Person</Label> 
    <WrapPanel> 
     <Label>First Name:</Label> 
     <Label Content="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=MyPerson.FirstName}"></Label> 
    </WrapPanel> 
    <WrapPanel> 
     <Label>Last Name:</Label> 
     <Label Content="{Binding MyPerson.Surname}"></Label> 
    </WrapPanel> 
</StackPanel> 

編輯:好,非常感謝這麼遠。我已經改變了第二表達式:

<Label Content="{Binding Surname}"></Label> 

我仍然無法得到它的工作雖然!

+1

嘗試添加此命名空間的xmlns:診斷=」 CLR的命名空間:System.Diagnostics程序;裝配= WindowsBase」 並添加綁定診斷:PresentationTraceSources.TraceLevel =高看綁定錯誤是什麼。你的綁定應該看起來像Content =「{Binding Surname,diag:PresentationTraceSources.TraceLevel = High}」 – 2010-05-28 12:23:43

+0

每當你有一個數據綁定錯誤 - 不,每當你調試任何使用數據綁定的WPF應用程序時,有VS的輸出窗口打開並在屏幕上可見,這樣你就可以看到綁定寫入它的許多錯誤消息,當它不工作時。 – 2010-05-28 18:53:57

+1

此問題的標題應該正確,以讀取「WPF DataBinding to * XAML *中的標準CLR屬性」。在代碼隱藏中綁定是一個完全不同的問題。 – kpozin 2010-10-06 21:11:29

回答

2

好吧,我在這裏發現了這個問題。 WPF是新手,所以花了我一段時間才弄明白。

在後面的代碼中,我在設置MyPerson屬性之後,調用了InitializeComponent的

我使用的第一種方法是因爲Window初始化並且MyPerson屬性由標籤初始化時設置的,並且它的數據綁定表達式被評估。

第二種方法不起作用,因爲MyPerson屬性在Window和關聯的DataContext初始化時尚未設置。

簡單,當你知道如何!

1

對於第二種方法的工作,你只需要

<Label Content="{Binding Surname}"/> 

,因爲你已經在頂部的窗口元素設置的DataContext的人。

頂級datacontext適用於我,但綁定不會顯示在設計器中,除非我有一個單獨的類包含數據。對於這個工作,你會那麼做這樣的事情:

<Window.Resources> 
    <local:BindingClass x:Key="bindingClass"/> 
</Window.Resources> 
<Grid DataContext="{StaticResource bindingClass.MyPerson}"> 
    <Label Content="{Binding Surname}"/> 
</Grid> 

這需要你創建一個包含MyPerson屬性一個單獨的類(在這種情況下,所謂的BindingClass)。

我認爲這在設計器中有效,因爲我在xaml中明確創建了該類的新實例。

+0

啊,謝謝我看到了。我認爲這只是一個錯誤,從我改變事情的時候開始,試圖讓它發揮作用。如果我刪除了MyPerson限定符,它仍然不起作用。 – nukefusion 2010-05-28 11:42:38

+0

{Binding Path =姓氏} – 2010-05-28 11:47:12

+0

試了一下。我認爲問題在於我聲明DataContext的方式。只是不知道什麼.... – nukefusion 2010-05-28 11:57:20

1

首先,除非您在該綁定上設置診斷,否則大多數情況下不會看到綁定錯誤。第二個不起作用的原因是您已將DataContext設置爲MyPerson。既然這是DataContext,你需要做的就是綁定到屬性Surname。你現在的方式是試圖調用MyPerson.MyPerson.Surname。

0

另一種簡單的方法來處理,首先結合將是給你的窗口的名稱,並在具有約束力的ElementName引用它:

<Window x:Class="WpfApplication1.Window1" 
    Name="MyWindow" 
    ...> 
<StackPanel> 
    <Label>My Person</Label> 
    <WrapPanel> 
     <Label>First Name:</Label> 
     <Label Content="{Binding Path=MyPerson.FirstName, ElementName=MyWindow}"></Label> 
    </WrapPanel> 
    <WrapPanel> 
     <Label>Last Name:</Label> 
     <Label Content="{Binding MyPerson.Surname}"></Label> 
    </WrapPanel> 
</StackPanel> 
相關問題