Изменение привязки ContentControl на основе выбора в одном из двух списков - PullRequest
2 голосов
/ 23 марта 2011

У меня есть два элемента управления ListBox в окне. Каждый представляет собой список аллергий пациентов, связанных с различными StaticResources. В нижней части окна у меня есть ContentControl, который отображает дополнительную информацию о выбранной аллергии в списке выше.

screenshot of XAML window with two ListBox controls and a ContentControl for showing details

В настоящее время у меня есть два ContentControls, по одному для каждого из списков, оба с Visiblity="Collapsed". Когда пользователь делает выбор, я делаю видимым связанный элемент управления контентом и сворачиваю другой. Я хотел бы иметь только один элемент управления контентом и изменить его привязку.

До сих пор я безуспешно пробовал каждое из следующих действий:

this.ExpandedAllergyDetails.Content = "InsideAllergiesSource";
this.ExpandedAllergyDetails.SetBinding(ContentControl.ContentProperty, "InsideAllergiesSource");
this.ExpandedAllergyDetails.SetBinding(ContentControl.ContentProperty, new Binding());
this.ExpandedAllergyDetails.SetResourceReference(ContentControl.ContentProperty, this.Resources["InsideAllergiesSource"]);
this.ExpandedAllergyDetails.SetResourceReference(ContentControl.ContentProperty, this.FindResource("InsideAllergiesSource"));

В каждом случае я пытался использовать только один ContentControl с именем ExpandedAllergyDetails и изменить его привязку на «InsideAllergiesSource», который представляет собой CollectionViewSource, определенный в XAML.

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Вы можете обернуть эти два списка в ListBox как элементы, так что, когда выбрана одна аллергия, также выбирается соответствующий основной список, таким образом вы можете привязать путь выбора, то есть SelectedMainList -> SelectedAllergy. Не уверен, как это преобразуется в код вашего конкретного приложения, но вот рабочий пример сценария, обратите внимание на стиль, необходимый для автоматического выбора родительского списка. Пример состоит из двух списков и TextBlock, который отображает выбранный элемент.

<TextBlock Text="{Binding ElementName=TestLB,
                          Path=SelectedItem.Content.SelectedItem.Content}"/>

<ListBox Name="TestLB">
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Setter Property="IsSelected" Value="True"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.Resources>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBoxItem>
        <ListBox>
            <ListBoxItem>List1-Item1</ListBoxItem>
            <ListBoxItem>List1-Item2</ListBoxItem>
            <ListBoxItem>List1-Item3</ListBoxItem>
        </ListBox>
    </ListBoxItem>
    <ListBoxItem>
        <ListBox>
            <ListBoxItem>List2-Item1</ListBoxItem>
            <ListBoxItem>List2-Item2</ListBoxItem>
            <ListBoxItem>List2-Item3</ListBoxItem>
        </ListBox>
    </ListBoxItem>
</ListBox>

Возможно, вы захотите замаскировать выбор из двух основных списков, этот ответ должен помочь с этим.


Редактировать: Поскольку триггер в вышеприведенном стиле также отменяет выбор основного списка, когда фокус клавиатуры перемещается изнутри списка, вы можете изменить его, чтобы он действовал только при срабатывании триггера, это можно сделать с помощью покадровой анимации в EnterActions триггера.

<Style TargetType="ListBoxItem">
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected">
                            <DiscreteBooleanKeyFrame KeyTime="0:0:0.0" Value="True"/>
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
        </Trigger>
    </Style.Triggers>
</Style>
0 голосов
/ 23 марта 2011

SetResourceReference принимает ключ, а не фактический объект. Так что вы бы использовали

this.ExpandedAllergyDetails.SetResourceReference(ContentControl.ContentProperty, "InsideAllergiesSource");

Если «InsideAllergiesSource» является ключом x: ресурса. Я не уверен, что это будет привязано к «текущему» элементу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...