Связывание C # / XAML / WPF работает частично, отображает только первый элемент в списке - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть то, что должно быть действительно простым связыванием, но проблема, с которой я сталкиваюсь, заключается в том, что вместо отображения трех компаний (список_компаний - это список, в котором компания содержит идентификатор_компании для привязки), я вижу всплывающее окно только с first company_id в company_list. У меня есть другие привязки, которые, кажется, работают нормально, и в некоторых других случаях я вижу, что я использовал ItemSource вместо DataContext, но когда я использую это, я получаю «Коллекция Items должна быть пустой перед использованием ItemsSource». Я много раз искал простой ответ на этот вопрос в stackoverflow, msdn и в других местах и ​​видел в основном действительно сложные решения, которые я не смог понять / применить.

Когда появляется мое окно, оно имеет:

CompanyA

где должно быть:

CompanyA
CompanyB
CompanyC

который является содержимым списка компании (да, проверено в отладчике). Предложения приветствуются! Код и XAML следуют.

    ReadMasterCompanyList();  // populates a_state.company_list with 3 companies
    // display company list dialog
    CompanySelect cs_window = new CompanySelect();
    cs_window.CompanyListView.DataContext = a_state.company_list;
    // fails: cs_window.CompanyListView.ItemsSource = a_state.company_list;
    cs_window.Show();

И XAML от CompanySelect:

<Grid>
    <ListView IsSynchronizedWithCurrentItem="True" 
      x:Name="CompanyListView"
       SelectionMode="Single" SelectionChanged="CompanyListView_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Height" Value="30"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListViewItem Content="{Binding Path=company_id}"></ListViewItem>
    </ListView>
</Grid>

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Я бы установил ItemsSource объекта ListView, а не DataContext, либо в codebehind:

cs_window.CompanyListView.ItemsSource = a_state.company_list;

или с переплетом:

<ListView ItemsSource="{Binding company_list}">

А затем вместо этого установите ItemTemplate объекта ListView.

...
<ListView.ItemTemplate>
  <DataTemplate>
    <TextBlock Text="{Binding company_id}" />
  </DataTemplate>
</ListView.ItemTemplate>
...

Я бы также рассмотрел использование шаблона проектирования MVVM для тестирования и разделения проблем, а также рассмотрю использование PascalCase для имен ваших свойств.

Кроме того, если вы специально не хотите ListView, я бы использовал ListBox.

0 голосов
/ 18 февраля 2011

Во-первых, установите DataContext только после cs_window.Show ().

Во-вторых, ListViewItem, который у вас есть как дочерний элемент в XAML вашего ListView, является причиной того, что вы видите только один.

В-третьих, может работать лучше (и будет больше MVVM-иша), если вы определите ItemsSource в XAML, например:

<ListView ItemsSource="{Binding Path=company_list}" ...>

Это после создания a_state DataContext контейнера ListView или какого-либо другого элемента-предка.

0 голосов
/ 18 февраля 2011

Проблема в том, что вы определяете один ListViewItem в своем коде XAML. Ты не должен этого делать.
Попробуйте что-то вроде этого:

<Grid>
    <ListView IsSynchronizedWithCurrentItem="True" 
      x:Name="CompanyListView"
       SelectionMode="Single" SelectionChanged="CompanyListView_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Height" Value="30"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Content={Binding Path=company_id}/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...