我有一些xaml只会将文本从一个文本框复制到另一个文本框:
<StackPanel Orientation="Horizontal">
<TextBox Width="100" Height="30" Text="{Binding ElementName=src1, Path=Text}" />
<TextBox x:Name="src1" Width="100" Height="30" />
</StackPanel>
没什么特别的,工作正常。有点傻,但只是一个例子。 但是,如果我将StackPanel作为资源放在Window中并从代码动态创建,如下所示:
<Window.Resources>
<StackPanel x:Key="MySP" Orientation="Horizontal">
<TextBox Width="100" Height="30" Text="{Binding ElementName=src, Path=Text}"/>
<TextBox x:Name="src" Width="100" Height="30" />
</StackPanel>
</Window.Resources>
..然后元素绑定不再起作用了。
为什么呢?以及如何使它工作?任何想法都感激不尽。
答案 0 :(得分:2)
以下Xaml应该可以正常工作
<Window ...>
<Window.Resources>
<StackPanel x:Key="MySP" Orientation="Horizontal">
<TextBox Width="100" Height="30" Text="{Binding ElementName=src, Path=Text}"/>
<TextBox x:Name="src" Width="100" Height="30" />
</StackPanel>
</Window.Resources>
<StaticResource ResourceKey="MySP"/>
</Window>
您也可以从代码
中使用它StackPanel mySP = TryFindResource("MySP") as StackPanel;
if (mySP != null)
{
this.Content = mySP;
}
但是,您在Windows资源中拥有StackPanel
的原因是什么?
如果您希望能够多次重复使用它,则必须在资源上设置x:Shared="False"
,但在第二次添加时会出现类似Cannot register duplicate Name 'src' in this scope
的异常。
答案 1 :(得分:0)
就我而言,你不应该把它放在&lt; Window.Resources&gt;中。只有样式,静态,动态资源等...
http://msdn.microsoft.com/en-us/library/ms750613.aspx
<Window>
<Window.Resources>
</Window.Resources>
<StackPanel x:Key="MySP" Orientation="Horizontal">
<TextBox Width="100" Height="30" Text="{Binding ElementName=src, Path=Text}"/>
<TextBox x:Name="src" Width="100" Height="30" />
</StackPanel>
<Window>
答案 2 :(得分:0)
有一个类似的问题,试图获得我的源代码控制的相对绑定 - 在我的情况下,我正在创建一个设计器并需要将该元素作为静态,因此样式可以使用它的尺寸来在画布上居中计算。
从[WPF Xaml Namescopes]中选择一行,
ResourceDictionary不使用XAML名称或名称范围;它使用键代替,因为它是一个字典实现。
因此,直接在资源Dictionary中使用ElementName根本不起作用,因为没有名称将在没有NameScope的情况下绑定。还试图用Style setter重现你的情况,但没有运气 - 你不能通过Style设置一个对象的名字。
现在,我提出的复杂解决方案是
ElementName=Root
替换为RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type namespace:RootClass}}
并绑定
直接说容器,允许你绑定说
DependencyProperty绕过名称。