Связывание Wpf Combobox в ListView - PullRequest
4 голосов
/ 08 февраля 2010

У меня проблема с привязкой данных в выпадающем списке в просмотре списка. У меня есть два класса:

  • Сделка
  • Подложка

Транзакция имеет атрибут Субстрата, и Транзакции сохраняются в Базе данных. В начале программы я хочу загрузить все транзакции в виде списка и показать их в ListView. Каждая возможность субстрата должна быть показана в комбинированном окне, где выбран фактический субстрат.

Я пробовал вот так 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; }
    }
}

Проблема в том, что все записи списка отображаются в виде списка, и для каждой строки все возможности субстрата находятся в комбинированном списке. Но только для первой строки ListView выбирается фактический субстрат.

1 Ответ

2 голосов
/ 08 февраля 2010

Ваш 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...