我有一个窗口,其中两个ListBox
es都绑定到XMLDataProvider
。 SelectedItem
的{{1}}属性与Listbox1
的{{1}}属性双向绑定。到目前为止一切都很好。
SelectedItem
包含ListBox2
ListBox2
,当鼠标悬停在某个项目上时,会将Style
设置为true。由于双向绑定,也选择了Trigger
中的相应项。当我通过点击IsSelected
选择项目
例如,当我在ListBox1
中选择“Book 1”时,将鼠标移到Listbox1
中的所有项目上,当样式触发器触发时,将不再选择“Book 1”项目。只要我在ListBox1
中选择了一个项目,我就无法再通过将鼠标移到ListBox2
上来选择相应的项目。但是,通过鼠标点击选择仍然有效。
有人可以解释行为和/或提供解决方案吗?
Listbox1
答案 0 :(得分:3)
问题是由双向绑定引起的。当您在ListBox
1中选择一个项目时,它会在SelectedItem
上设置ListBox
属性.2。这会“覆盖”Binding
上的ListBox2.SelectedItem
设置。如果需要,您可以在Snoop验证。
至于如何实现目标,您应该使用集合视图和IsSynchronizedWithCurrentItem
属性。 ListBox
es都应该绑定到同一个集合视图并与当前项同步。因此,选择一个ListBox
中的项目会强制其他ListBox
与所选项目同步。
以下是实现此目标所需的最低XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style TargetType="ListBox">
<Style.Setters>
<Setter Property="Width" Value="150"/>
<Setter Property="Margin" Value="4"/>
</Style.Setters>
</Style>
<!-- define the XML data source as a resource -->
<XmlDataProvider x:Key="TestData" XPath="/Books">
<x:XData>
<Books xmlns="">
<Book>
<Title>Book 1</Title>
<Author>Mister 1</Author>
</Book>
<Book>
<Title>Book 2</Title>
<Author>Mister 2</Author>
</Book>
<Book>
<Title>Book 3</Title>
<Author>Mister 3</Author>
</Book>
<Book>
<Title>Book 4</Title>
<Author>Mister 4</Author>
</Book>
<Book>
<Title>Book 5</Title>
<Author>Mister 5</Author>
</Book>
<Book>
<Title>Book 6</Title>
<Author>Mister 6</Author>
</Book>
</Books>
</x:XData>
</XmlDataProvider>
<CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource TestData}, XPath=Book}"/>
</Window.Resources>
<Grid>
<StackPanel Orientation="Horizontal">
<StackPanel>
<Label HorizontalContentAlignment="Center">Listbox 1</Label>
<ListBox x:Name="box1" ItemsSource="Source={StaticResource cvs}}" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding XPath=Title}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel>
<Label HorizontalContentAlignment="Center">Listbox 2</Label>
<ListBox x:Name="box2" ItemsSource="{Binding Source={StaticResource cvs}}" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding XPath=Title}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</StackPanel>
</Grid>
</Window>