Связывание элементов WPF в элементе управления ресурсами не работает - PullRequest
3 голосов
/ 12 августа 2011

У меня есть 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.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 ]

2 голосов
/ 12 августа 2011

Следующий 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;
}

Однако, почему у вас есть StackPanel в Windows Resoures?
Если вы хотите иметь возможность использовать его несколько раз, вам нужно будет установить x:Shared="False" на Ресурсе, но тогда вы получите исключение, сообщающее что-то вроде Cannot register duplicate Name 'src' in this scope при втором добавлении.

0 голосов
/ 18 декабря 2013

Имея аналогичную проблему, пытаясь получить относительную привязку к моему элементу управления исходным кодом - в моем случае я создаю конструктор и мне нужен элемент в качестве статического элемента, чтобы стили могли использовать его размеры для центрирования вычислений на холсте.

Взяв строку из [WPF Xaml Namescopes],

ResourceDictionary не использует имена XAML или области имен;вместо этого он использует ключи, потому что это реализация словаря.

Таким образом, непосредственное использование ElementName в словаре ресурсов просто не работает, потому что никакое имя не будет связываться без NameScope.Также попытался воспроизвести вашу ситуацию с помощью сеттеров стилей, но не повезло - нельзя установить имя объекта с помощью стиля.

Теперь запутанное решение, с которым я сталкиваюсь, заключается в

  1. Создатьсвойство DependencyProperty в коде позади класса, в котором вы объявляете этот ресурс.
  2. замените ElementName=Root на RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type namespace:RootClass}} и привязайте его непосредственно к указанному контейнеру, что позволит вам связываться с указанным объектом DependencyProperty, обходя при этом имена.
  3. Если вам нужны привязки для работы между двумя элементами в одном и том же StaticResource, привяжите источник к указанному DependencyProperty как OneWayToSource или TwoWay, а пункт назначения - как OneWay или TwoWay.

1

0 голосов
/ 12 августа 2011

Насколько я понимаю, вы не должны помещать это в . Только стили, статические, динамические ресурсы и тому подобное ...

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>
...