WPF中列表框的奇怪行为

时间:2009-11-06 07:34:54

标签: wpf xaml select binding listbox

我有一个窗口,其中两个ListBox es都绑定到XMLDataProviderSelectedItem的{​​{1}}属性与Listbox1的{​​{1}}属性双向绑定。到目前为止一切都很好。

SelectedItem包含ListBox2 ListBox2,当鼠标悬停在某个项目上时,会将Style设置为true。由于双向绑定,也选择了Trigger中的相应项。当我通过点击IsSelected选择项目

时会出现问题

例如,当我在ListBox1中选择“Book 1”时,将鼠标移到Listbox1中的所有项目上,当样式触发器触发时,将不再选择“Book 1”项目。只要我在ListBox1中选择了一个项目,我就无法再通过将鼠标移到ListBox2上来选择相应的项目。但是,通过鼠标点击选择仍然有效。

有人可以解释行为和/或提供解决方案吗?

Listbox1

1 个答案:

答案 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>