我不太習慣WPF,所以這可能是簡單的,但我一直在掙扎幾個小時,似乎無法得到正確地做到這一點。將根的屬性綁定到XAML中的子元素的值
說我有一個BaseUserControl
從UserControl
下降與依賴屬性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中相同的屬性。
這真的很奇怪。諸如任何其他容器(不是UserControl)的類似綁定方案都可以很好地工作。雖然原因尚不清楚,但您可以嘗試反向綁定(目標是「MyTextBox」,源代碼是usercontrol,當然應該使用雙向綁定模式)。 – 2014-11-08 07:07:24
這是行不通的,因爲我不能指定一個名字('BaseUserControl'會是抽象的)。我可以爲類型'BaseUserControl'做一個'FindAncestor',但那不是一般的(它可以在其中找到其他的'BaseUserControls') – Jcl 2014-11-08 11:30:05