2014-11-08 72 views
0

我不太習慣WPF,所以這可能是簡單的,但我一直在掙扎幾個小時,似乎無法得到正確地做到這一點。將根的屬性綁定到XAML中的子元素的值

說我有一個BaseUserControlUserControl下降與依賴屬性Text

然後在XAML中創建一個BaseUserControl後裔。我希望該屬性Text被綁定到在該後代中定義的控件。你說:

<base:BaseUserControl 
     ... all namespaces ... 
     xmlns:base="clr-namespace:MyControlsBase" 
     x:Class="Test.MyTestControl" 
     Text="{Binding ElementName=MyTextBox, Path=Text}" 
    <TextBox x:Name="MyTextBox" Text="MyText" /> 
</base:BaseUserControl> 

出於某種原因,我不能讓MyTextBox以更新控制自身的Text財產。

如果我添加一個:

<TextBlock Text="{Binding ElementName=MyTextBox, Path=Text}" /> 

任何地方控制裏面,文本塊顯示正確的文本框的值,因此綁定定義似乎並不成爲問題。

我有別的東西這表明在該控制Text價值......這樣說:

<Window> 
    <StackPanel> 
    <test:MyTestControl x:Name="MyControl" /> 
    <TextBlock Text="{Binding ElementName=MyControl, Path=Text}" /> 
    </StackPanel> 
</Window> 

如果我更新來自任何其他方式在MyControlBase Text屬性(代碼隱藏,或其他),它可以工作,並且我看到文本塊上的文本發生了變化......但是當它自己內部的文本框被更新時,它似乎無法更新。

當您繼承控件時,綁定屬性是否有任何限制?

PS:代碼顯然是人爲的,boilerplated這個問題

注意:有明顯有毛病該財產的結合,因爲在跟蹤窗口上,創建控件時,我得到:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=MyTextBox'. BindingExpression:Path=Text; DataItem=null; target element is 'MyTestControl' (Name=''); target property is 'Text' (type 'String')

但它只會發生在`MyTestControl的財產,而不是爲了其他任何綁定到XAML中相同的屬性。

+0

這真的很奇怪。諸如任何其他容器(不是UserControl)的類似綁定方案都可以很好地工作。雖然原因尚不清楚,但您可以嘗試反向綁定(目標是「MyTextBox」,源代碼是usercontrol,當然應該使用雙向綁定模式)。 – 2014-11-08 07:07:24

+0

這是行不通的,因爲我不能指定一個名字('BaseUserControl'會是抽象的)。我可以爲類型'BaseUserControl'做一個'FindAncestor',但那不是一般的(它可以在其中找到其他的'BaseUserControls') – Jcl 2014-11-08 11:30:05

回答

2

我相信問題是當BaseUserControl初始化自己並嘗試使用MyTextBox的Text屬性進行綁定時,MyTextBox尚未初始化。在這個階段,MyTextBox不存在,因此你得到'System.Windows.Data Error:4:無法找到SOURCE與參考綁定。

您可以在您的MyTestControl的CTOR中的InitializeComponent()之後綁定代碼隱藏。

public MyTestControl() 
{ 
    InitializeComponent(); 
    Binding b = new Binding("Text"); 
    b.Source = MyTextBox; 
    SetBinding(TextProperty, b); 
} 
+0

這可以工作,我將它標記爲答案...但是,我已經嘗試相同,但使用'b.ElementName =「MyTextBox」'而不是'b.Source = MyTextBox'(在構造對象之後),並且它不能在代碼隱藏中使用(同樣的問題,「用ElementName找不到源代碼='MyTextBox'')。 這絕對不是關鍵,但我想了解爲什麼它不起作用。 – Jcl 2014-11-08 11:28:02

+0

剛剛在.NET Framework 4和4.5中測試過,b.ElementName =「MyTextBox」的工作方式與b.Source相同。不知道你爲什麼不工作。 – Eben 2014-11-08 12:29:44