资源控件中的WPF元素绑定不起作用

时间:2011-08-12 09:19:37

标签: wpf data-binding resources

我有一些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>

..然后元素绑定不再起作用了。

为什么呢?以及如何使它工作?任何想法都感激不尽。

3 个答案:

答案 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设置一个对象的名字。

现在,我提出的复杂解决方案是

  1. 在类的代码隐藏中创建DependencyProperty 你在宣布这个资源。
  2. ElementName=Root替换为RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type namespace:RootClass}}并绑定 直接说容器,允许你绑定说 DependencyProperty绕过名称。
  3. 如果您需要绑定以在两个元素之间进行操作 StaticResource,将源绑定到所述DependencyProperty as OneWayToSource或TwoWay,目的地为OneWay或TwoWay。
  4. 1