我在这里关注教程.它显示了如何绑定到依赖项属性的基本示例.
<Binding ElementName="This" Path="IPAddress" UpdateSourceTrigger="PropertyChanged">
Run Code Online (Sandbox Code Playgroud)
其中"This"是当前窗口的名称:
<Window x:Class="SOTCBindingValidation.Window1" x:Name="This"
Run Code Online (Sandbox Code Playgroud)
无论何时我尝试做这样的事情,我都会遇到同样的错误:
无法找到引用'ElementName = GridControlControl1'的绑定源.BindingExpression:路径= ip地址; 的DataItem = NULL; target元素是'TextBox'(Name ='AddressBox'); target属性是'Text'(类型'String')
我的代码:
<UserControl x:Class="WpfGridtest.GridControl" x:Name="GridControlControl1" ... />
<TextBox x:Name="AddressBox">
<TextBox.Text>
<Binding ElementName="GridControlControl1" Path="IPAddress" UpdateSourceTrigger="PropertyChanged">
</Binding>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
代码隐藏:
partial class GridControl : UserControl
public static readonly DependencyProperty IPAddressProperty = DependencyProperty.Register("IPAddress", typeof(string), typeof(GridControl), new UIPropertyMetadata("1.1.1.1"));
public string IPAddress
{
get { return (string)GetValue(IPAddressProperty); }
set { SetValue(IPAddressProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)
它几乎就像.Net 4.0中发生了变化?
这取决于你想要什么.我会尝试提供一个完整的答案.使用这种语法保证更好成功的一种方法是使用VS2010的XAML绑定构建器,这就是我组装您将要看到的语法的方式.
如果你想让UserControl的一个元素显示你的IPAddress依赖属性(看起来它正确地定义给我),在UserControl的标记体内使用这个语法:
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type my:GridControl},
AncestorLevel=1},
Path=IPAddress}" />
Run Code Online (Sandbox Code Playgroud)
大多数XAML绑定示例使用此语法而不是更详细的分层XML:
<TextBlock>
<TextBlock.Text>
<Binding Path="IPAddress">
<Binding.RelativeSource>
<RelativeSource Mode="FindAncestor"
AncestorType="{x:Type my:GridControl}"
AncestorLevel="1"
/>
</Binding.RelativeSource>
</Binding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
...但两种语法都会产生相同的结果.请注意,这AncestorType是UserControl的类名,而不是x:Name在其他标记中使用UserControl时提供的类名.
假设您在UserControl外部的标记中有一个UI元素,并且您希望访问该另一个控件的DependencyProperty.标记看起来像这样:
<my:GridControl
x:Name="GridControl1" IPAddress="192.168.1.1" />
<TextBox Text="{Binding ElementName=GridControl1, Path=IPAddress}"/>
Run Code Online (Sandbox Code Playgroud)
或者,或者,这个:
<TextBox>
<TextBox.Text>
<Binding ElementName="GridControl1" Path="IPAddress"/>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
请注意,这次你使用的x:Name是GridControl 的属性而不是类名,并且你将它称为an ElementName,而不是"祖先".但是,在这两种情况下,都是Path您定义的DependencyProperty的声明名称.
| 归档时间: |
|
| 查看次数: |
9234 次 |
| 最近记录: |