2015-03-01 2 views
0

Итак, у меня есть несколько ListView s. Первый привязан к ObservaleCollection<ComPort>. Все свойства ComPort могут принимать некоторые предопределенные значения. Другие ListView s отвечают за эти свойства: они показывают все возможные (предопределенные) значения, а SelectedItem должны быть текущим значением этого свойства ComPort с первого ObservaleCollection.Как связать свойства одного ObservableCollection ListView с свойствами SelectedItem другого ListView?

Я не могу прикрепить изображения так, здесь является внешняя картина, это сделало бы ситуацию чистой: 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, но в любом случае я не могу справиться с ним без помощи. Как решить эту задачу?

+0

Можете ли вы поделиться своим кодом класса ComPort? Если я понимаю вас правильно, я думаю, что вам нужно поместить ваши другие коллекции свойств (BaudRates, Parities и т. Д.) В класс ComPort, чтобы вы могли привязываться к ним. – lena

ответ

0

1) Вместо того, чтобы при обращении с ними SelectionChanged на PortsList ListView, связать свой флажок с ListViewItemsPanel так:

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

2) Добавить х: Имя вашего первого ListBox, скажем, х: Name = "ComPortLB «; 3) Удалить DataContext в SystemPortsList; 4) Закрепить SelectedItem на SystemPortsList так:

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

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

+0

Хм, флажок будет использоваться для некоторых других вещей, но 'SelectedValue =" {Binding ElementName = ComPortLB, Path = SelectedValue.PortName} "является именно тем, что мне нужно! Большое спасибо. Теперь кажется таким чертовски легким и очевидным :-) – eexaxa

+0

Отметить как ответ тогда? –

Смежные вопросы