wpf - ListBox - привязать SelectedItem к атрибуту xml? - PullRequest
0 голосов
/ 20 сентября 2010

У меня есть список элементов в пользовательском контроле, который заполняется XML-файлом.

<Machines xmlns="">
  <Machine Name="Prod1" IP="192.168.1.200" isDefault="true" InstanceName="sql08" />
  <Machine Name="Prod2" IP="192.168.1.101" />
  <Machine Name="Test1" IP="192.168.1.103" />
  <Machine Name="Test2" IP="192.168.1.104" />
</Machines>

Я хочу привязать выбранный элемент списка к компьютеру, который имеет атрибут isDefault = true.

Мои текущие xmldataprovider и ItemTemplate перечислены ниже вместе с моей разметкой ListBox.Я не был уверен, нужно ли мне делать какую-либо привязку xpath в табличке данных или мне следует создать явный стиль с триггером для этой задачи?Или если какой-либо из этих подходов сработает?Одна из вещей, которую я не могу понять, это то, как я могу связать атрибут, который существует только в одном узле моего файла.

<XmlDataProvider x:Key="DataList" Source="XML\ListboxSettings.xml" XPath="Machines/Machine"/>
        <DataTemplate x:Key="MachineDataTemplate">
            <TextBlock Text="{Binding XPath=@Name}" ToolTip="{Binding XPath=@IP}" />
        </DataTemplate>

<ListBox Name="MerlinsListbox" Margin="5" Height="{Binding Height, ElementName=border}" Background="#FF252525" FontFamily="Consolas" FontSize="16" Foreground="#FFFBF9F9"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource MerlinDataTemplate}"
                     IsSynchronizedWithCurrentItem="true"/>

1 Ответ

0 голосов
/ 20 сентября 2010

Возможны два варианта:

1) Вы можете установить ItemContainerStyle и связать свойство IsSelected объекта ListBoxItem с атрибутом @isDefault.

<ListBox Name="MerlinsListbox" Margin="5" 
            Background="#FF252525" FontFamily="Consolas" FontSize="16" Foreground="#FFFBF9F9"
            ItemsSource="{Binding Source={StaticResource DataList}}"
            ItemTemplate="{StaticResource MachineDataTemplate}"
            IsSynchronizedWithCurrentItem="true">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected" Value="{Binding XPath=@isDefault, Mode=OneTime}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Или 2) добавить триггер для ItemContainerStyle:

<ListBox ...>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding XPath=@isDefault}" Value="true">
                    <Setter Property="IsSelected" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
...