WPF数据绑定ListView与ComboBox选定项目问题

时间:2011-08-05 09:22:28

标签: wpf data-binding listview combobox selecteditem

我有一个数据绑定的ComboBox,我似乎无法设置SelectedItem。我尝试过SelectedValue / SelectedValuePath,但遇到了困难。

为了解释这个场景,我有一个父ListView,里面包含ListViewItems中的ComboBox。父ListView和子ComboBox具有相同的数据源,但显示不同的数据。例如,扩展2引用扩展1.在这种情况下,我试图说明2个镜像一个。用户需要能够更改它指向的扩展,本身或任何其他扩展。除此之外,它非常简单,但几乎拥有它。

这是您可以从您喜欢的xaml编辑器运行的示例。

 <Page
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

 <Page.Resources>

  <XmlDataProvider x:Key="xmlDataProvider">
   <x:XData>
    <Extensions xmlns="">
     <Extension>
      <ExtId>1</ExtId>
      <ExtName>Extension 1</ExtName>
      <ExtValue>1</ExtValue>
     </Extension>
     <Extension>
      <ExtId>2</ExtId>
      <ExtName>Extension 2</ExtName>
      <ExtValue>1</ExtValue>
     </Extension>
     <Extension>
      <ExtId>3</ExtId>
      <ExtName>Extension 3</ExtName>
      <ExtValue>3</ExtValue>
     </Extension>
     <Extension>
      <ExtId>4</ExtId>
      <ExtName>Extension 4</ExtName>
      <ExtValue>4</ExtValue>
     </Extension>
    </Extensions>
   </x:XData>
  </XmlDataProvider>

  <!-- Extensions -->
  <CollectionViewSource 
   x:Key="CollectionViewSourceExtensions" 
   Source="{Binding Source={StaticResource xmlDataProvider}, XPath=Extensions/Extension}" />

 </Page.Resources>

 <Grid> 

  <ListView 
   ItemsSource="{Binding 
   Source={StaticResource CollectionViewSourceExtensions},
   Mode=OneWay}">

   <ListView.ItemTemplate>
     <DataTemplate>
       <StackPanel>
       <StackPanel Orientation="Horizontal">
         <TextBlock Text="{Binding XPath=ExtName}" />
         <TextBlock Text=" - " />
         <TextBlock Text="{Binding XPath=ExtValue}" />
       </StackPanel>
       <ComboBox
        SelectedItem="{Binding XPath=ExtId}"
        ItemsSource="{Binding
          Source={StaticResource CollectionViewSourceExtensions},
          Mode=OneTime}">

         <ComboBox.ItemTemplate>
           <DataTemplate>
             <TextBlock Text="{Binding XPath=ExtId}" />
           </DataTemplate>
         </ComboBox.ItemTemplate>

        </ComboBox>
       </StackPanel>
     </DataTemplate>
   </ListView.ItemTemplate>

 </ListView>

 </Grid>

</Page>

1 个答案:

答案 0 :(得分:0)

这是一个简单的解决方案,需要花费大量时间才能最终弄明白......

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="SamplePeople">
        <x:XData>
            <Extensions xmlns="">
                <Exension>
                    <Id>1</Id>
                    <Name>Line Key 1</Name>
                    <Value>1</Value>
                </Exension>
                <Exension>
                    <Id>2</Id>
                    <Name>Line Key 2</Name>
                    <Value>1</Value>
                </Exension>
                <Exension>
                    <Id>3</Id>
                    <Name>Line Key 3</Name>
                    <Value>3</Value>
                </Exension>
                <Exension>
                    <Id>4</Id>
                    <Name>Line Key 4</Name>
                    <Value>4</Value>
                </Exension>
            </Extensions>
        </x:XData>
    </XmlDataProvider>    
</Page.Resources>
<Grid>  
    <ListBox x:Name="PeopleListBox" 
        DataContext="{Binding Source={StaticResource SamplePeople}}" 
        ItemsSource="{Binding Mode=Default, XPath=/Extensions/node()}" 
        IsSynchronizedWithCurrentItem="True">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding XPath=Name}" />
                    <TextBlock Text=" is " />
                        <ComboBox
                        SelectedValue="{Binding XPath=Value}"
                                ItemsSource="{Binding Mode=Default, XPath=/Extensions/Exension/Id}" >
                            </ComboBox>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
</Page>