如何将ListView的一个ObservableCollection的属性绑定到另一个ListView的SelectedItem的属性?

时间:2015-03-01 18:58:26

标签: c# wpf xaml listview

所以我有几个ListView。第一个绑定到ObservaleCollection<ComPort>ComPort的所有属性都可能需要一些预定义的值。其他ListView负责该属性:它们显示所有可能的(预定义)值,SelectedItem应该是第一个ObservaleCollection的ComPort属性的当前值。

我无法附加图片,所以这里是外部图片,它会使情况变得清晰:http://i.stack.imgur.com/ZBRRx.png

<Window.Resources>
    <ResourceDictionary x:Name="rd">
        <l:ComPorts x:Key="vComPorts"/>
        <l:SystemPorts x:Key="vSystemPorts"/>
        <l:BaudRates x:Key="vBaudRate"/>
        <l:Parities x:Key="vParities"/>
        <l:DataBits x:Key="vDataBits"/>
        <l:StopBits x:Key="vStopBits"/>
        <l:Timeouts x:Key="vTimeouts"/>
        <l:ComPort x:Key="vSelectedPort"/>
    </ResourceDictionary>
</Window.Resources>

...

<ListView
            Name="PortsList"
            Grid.Row="1"
            Grid.Column="0"
            Margin="5"
            VerticalAlignment="Stretch"
            ItemsSource="{StaticResource vComPorts}"
            DataContext="{StaticResource vComPorts}"
            SelectedValuePath="PortName"
            SelectedValue="{Binding ElementName=SystemPortsList, Path=SelectedItem.Value}"
            SelectionChanged="PortsList_SelectionChanged"
            MouseDoubleClick="PortsList_MouseDoubleClick">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox />
                        <TextBlock Margin="5,0,0,0" Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <ListView 
            x:Name="SystemPortsList"
            Margin="5"
            VerticalAlignment="Stretch"
            DataContext="{Binding Source={StaticResource vSelectedPort}}"
            ItemsSource="{Binding Source={StaticResource vSystemPortsView}}"
            SelectedItem="{Binding Source={StaticResource vSelectedPort}, Path=PortName}"
            MouseEnter="SystemPortsList_Refresh"
            MouseLeave="SystemPortsList_Refresh"
            Grid.Row="1"
            Grid.Column="1" SelectionChanged="SystemPortsList_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Name="tb" Margin="5,0,0,0" Text="{Binding Path=Name}" />
                    </StackPanel>
            </ListView.ItemTemplate>
        </ListView>

我尝试制作类ComPort的实例,用于保存第一个ListView中所选项目的当前值,但无论如何我无法在没有帮助的情况下处理它。这个任务应该如何解决?

1 个答案:

答案 0 :(得分:0)

1)不要在PortsList ListView上处理SelectionChanged,而是将复选框绑定到ListViewItemsPanel,如下所示:

<CheckBox IsChecked={Binding IsSelected, RelativeSource=Parent/>

2)将x:Name添加到第一个ListBox,比如x:Name =&#34; ComPortLB&#34 ;; 3)删除SystemPortsList上的DataContext; 4)修复SystemPortsList上的SelectedItem,如下所示:

SelectedValue="{Binding ElementName=ComPortLB, Path=SelectedValue.PortName}"

我还没有对这些代码进行测试,我暂时没有做过这种事情,所以我为错误道歉,但它应该让你更接近。由于您没有提供足够的信息,我还必须对您的课程做一些假设。