как исправить привязку, которая нарушает правила логического дерева - PullRequest
0 голосов
/ 06 ноября 2011
InvalidOperationException: Specified element is already 
the logical child of another element. Disconnect it first.

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

Если на панели стека есть только одна кнопка, использующая эти привязки, она работает. Но больше одной кнопки нет.

Я действительно не понимаю, почему это нарушает правило с одним родителем, или не знаю, как это исправить. Может ли кто-нибудь развить мою привязку к тому, который работает?

Приветствия
Berryl

Базовая привязка в словаре ресурсов

<Style x:Key="BoundImageButtonStyle" TargetType="{x:Type Button}" >
    <Setter Property="Content">
        <Setter.Value>
            <Image Source="{Binding SmallImage}" />
        </Setter.Value>
    </Setter>
    <Setter Property="Command" Value="{Binding Command}" />
    <Setter Property="ToolTip" Value="{Binding ToolTipTitle}" />
</Style>

Связывание в виде

    <StackPanel Orientation="Horizontal" Height="30" Grid.Row="1" HorizontalAlignment="Center">
        <StackPanel.Resources >
            <sys:Double x:Key="btnSize">24</sys:Double>
            <Style x:Key="btnStyle" TargetType="Button" BasedOn="{StaticResource BoundImageButtonStyle}">
                <Setter Property="Height" Value="{StaticResource btnSize}" />
                <Setter Property="Width" Value="{StaticResource btnSize}" />
            </Style>
        </StackPanel.Resources>

        <Button Style="{StaticResource btnStyle}" DataContext="{Binding AddItemControl}" />
        <Button Style="{StaticResource btnStyle}" DataContext="{Binding EditItemControl}" />
        <Button Style="{StaticResource btnStyle}" DataContext="{Binding DeleteItemControl}" />

    </StackPanel>

Пример привязки источника в ViewModel

    public ButtonData AddItemControl
    {
        get
        {
            return _addItemControl ??
            (_addItemControl = new ButtonData
            {
                ToolTipTitle = _crudTextConverter.AddNew(this),
                SmallImage =
                    "pack://application:,,,/Smack.Core.Presentation.Wpf;component/Images/simplicio_add.png",
                Command = AddItemCommand,
            });
        }
    }
    private ButtonData _addItemControl;

1 Ответ

1 голос
/ 06 ноября 2011

Это создает только один Image для всех элементов управления, к которым применяется стиль:

<Setter Property="Content">
    <Setter.Value>
        <Image Source="{Binding SmallImage}" />
    </Setter.Value>
</Setter>

Вы можете экспортировать изображение и сделать его нераспространенным :

<!-- In some compiled Resources dictionary that is accessible from the style -->
<Image x:Key="image" x:Shared="false"
       Source="{Binding SmallImage}" />
<Setter Property="Content" Value="{StaticResource image}"/>

В качестве альтернативы вы можете установить ContentTemplate, вместо этого все кнопки имеют один и тот же экземпляр шаблона, но элементы пользовательского интерфейса создаются из него независимо:

<Setter Property="Content" Value="{Binding}"/>
<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Image Source="{Binding SmallImage}" />
        </DataTemplate>
    </Setter.Value>
</Setter>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...