ListView中的Wpf Combobox绑定

时间:2010-02-08 13:10:47

标签: wpf data-binding listview combobox

我在listview中对组合框进行数据绑定时遇到了问题。 我有两个班:

  • 交易
  • 基材

Transaction具有Substrate的属性,Transactiona保存在Datebase中。在程序开始时,我想将所有事务作为列表加载并在ListView中显示它们。 Substrate的每种可能性都应该在Combobox中显示,其中选择了实际的Substrate。

我试过这样的话 XAML

<ListView.View>
            <GridView>

                <GridViewColumn Header="Menge">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Amount}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Substrate">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox 
                                ItemsSource="{Binding ElementName=InternTransaction, Path=SubstrateList}"
                                DisplayMemberPath="Description"
                                SelectedValuePath="SubstrateID"
                                SelectedItem="{Binding Path=Substrate.SubstrateID}">
                            </ComboBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>

代码隐藏

public partial class UCInternTransaction : UserControl
{
    #region Attribute
    private BsCBTTransactionController mTransactionController;
    private ObservableCollection<BsCBTSubstrate> mSubstrateList;
    #endregion

    public UCInternTransaction()
    {

        InitializeComponent();

        //Load Transactions
        this.mTransactionController = WpfBioGas.Core.BsCAppFactory.getInstance().getCBTTransactionController();
        this.mTransactionController.loadTransactions();
        this.DataContext = this.mTransactionController.TransactionList;

        loadData();
    }

    private void loadData()
    {
        //Load Substrate and bind to CBSubstrate
        this.mSubstrateList = new ObservableCollection<BsCBTSubstrate>();
        foreach (BsCBTSubstrate sub in WpfBioGas.Core.BsCAppFactory.getInstance().getBTFacade().BsBTSubstrate.loadAll())
        {
            this.mSubstrateList.Add(sub);
        }
    }

    public ObservableCollection<BsCBTSubstrate> SubstrateList
    {
        get { return this.mSubstrateList; }
    }
}

问题是列表中的所有条目都显示在列表视图中,对于每一行,Substrate的所有可能性都在Combobox中。但只有Listview的第一行才会选择实际的Substrate。

1 个答案:

答案 0 :(得分:2)

您的ComboBox应该使用SelectedValue上的绑定而不是SelectedItem。

基于您在帖子中显示的片段提供修复有点困难,但这里有一个kaxaml就绪样本,它使用了几个内联XML数据源:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="CharacterData">
      <x:XData>
        <Data xmlns="">
          <Character First="Bart" Last="Simpson" Gender="M"/>
          <Character First="Homer" Last="Simpson" Gender="M"/>
          <Character First="Lisa" Last="Simpson" Gender="F"/>
          <Character First="Maggie" Last="Simpson" Gender="F"/>
          <Character First="Marge" Last="Simpson" Gender="F"/>
        </Data>
      </x:XData>
    </XmlDataProvider>
    <XmlDataProvider x:Key="GenderData">
      <x:XData>
        <Data xmlns="">
          <Gender ID="F" Description="Female" />
          <Gender ID="M" Description="Male" />
        </Data>
      </x:XData>
    </XmlDataProvider>
  </Page.Resources>
  <ListView ItemsSource="{Binding Source={StaticResource CharacterData}, XPath=Data/Character}">
    <ListView.View>
      <GridView>
        <GridViewColumn Header="Last Name" 
            DisplayMemberBinding="{Binding XPath=@First}" />
        <GridViewColumn Header="Gender">
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <ComboBox Width="75" SelectedValue="{Binding XPath=@Gender}" 
                  DisplayMemberPath="@Description" SelectedValuePath="@ID"
                  ItemsSource="{Binding Source={StaticResource GenderData}, XPath=Data/Gender}" />
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
      </GridView>
    </ListView.View>
  </ListView>
</Page>