Привязка в ItemTemplate на KeyValuePair не работает - PullRequest
3 голосов
/ 21 марта 2012

У меня проблема с установкой привязки в ItemTemplate ListView. Моя обязательная цель - KeyValuePair. Следующий код:

XAML:

<ListView x:Name="listViewDataItems" CanDragItems="True" DragItemsStarting="event" SelectionMode="Multiple">
  <ListView.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Path=Key}"/>
        <TextBlock Text=":"/>
        <TextBlock Text="{Binding Path=Value}"/>
      </StackPanel>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

C #:

protected override void OnNavigatedTo(NavigationEventArgs e) {
  if (e.Parameter != null) {
    IDataSourceExtension extension = (IDataSourceExtension)e.Parameter;
    pageTitle.Text = extension.Name;
    // Type of LastData: List<KeyValuePair<string,object>>
    listViewDataItems.ItemsSource = extension.LastData;                
  }
}

ItemsSource настроен нормально и содержит KeyValuePairs, но отображение ключа и значения в ListView не работает. Я работаю под .Net4.5 Beta в приложении в стиле metro.

1 Ответ

0 голосов
/ 21 марта 2012

Я проверял это:

public ObservableCollection<KeyValuePair<string, object>> LvItems { get; set; }

public MainWindow()
{
   InitializeComponent();
   this.DataContext = this;
   LvItems = new ObservableCollection<KeyValuePair<string, object>>();
   LvItems.Add(new KeyValuePair<string, object>("Idx", 5));
   LvItems.Add(new KeyValuePair<string, object>("Ido", 12));
}

И использовал твой шаблон, и он работал как заклинание.

Так что я думаю, что:

1) Вам необходимо использовать ObservableCollection, чтобы получать уведомления об изменениях в коллекции (в противном случае элементы могут быть здесь, но ListView не обновится, поскольку не знает, что коллекция изменилась).

2) Вы должны воздерживаться от прямой настройки коллекции: сделать ее доступной только для чтения и добавлять элементы один за другим вместо настройки коллекции. (или поднять PropertyChanged в установщике коллекции).

РЕДАКТИРОВАТЬ: полный код.

<Window x:Class="ConverterCombinerTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ConverterCombinerTest"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
         <ListView ItemsSource="{Binding LvItems}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Key}"/>
                        <TextBlock Text=":"/>
                        <TextBlock Text="{Binding Path=Value}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            LvItems = new ObservableCollection<KeyValuePair<string, object>>();
            LvItems.Add(new KeyValuePair<string, object>("Idx", 5));
            LvItems.Add(new KeyValuePair<string, object>("Ido", 12));
        }

        public ObservableCollection<KeyValuePair<string, object>> LvItems { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(String _Prop)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(_Prop));
            }
        }
    }
...