2012-03-21 7 views
3

ListViewのItemTemplateでバインディングを取得する際に問題が発生しました。私のバインディングターゲットはKeyValuePairです。次のコード:KeyValuePairのItemTemplateでのバインドが機能しない

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が含まれていますが、リストビュー内のキーと値を表示すると、動作していませんさ。私はメトロスタイルのアプリで.Net4.5 Betaの下で働いています。

答えて

0

私は、このテスト:

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)); 
} 

をそして、あなたのItemTemplateに使用し、それが魅力のように働きました。

だから私の最高の推測では、ということです:あなたはそれを認識していないので、それ以外の項目はここかもしれないが、リストビューが更新されません(コレクションの変更を通知するのObservableCollectionを使用する必要が

1)コレクションが変更されました)。

2)コレクションを直接設定することを控えてください。コレクションを設定する代わりに、読み取り専用にしてアイテムを1つずつ追加してください。 (または、コレクションのセッターでPropertyChangedを上げる)。

EDIT:完全コード。

<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)); 
      } 
     } 
    } 
+0

私は両方を試みましたが、機能しませんでした。 PropertyChanged()、ObservableCollectionと呼ばれるリストのセッターは役に立ちません。アイテムを1つ1つ設定することはあまりにも助かりません。コードを修正し、LastDataの代わりにコレクションのLvItemsを編集しましたが、表示されません。 –

+0

DataContextを正しく設定していますか?あなたの正確なXAMLと一緒に投稿した例は私のコンピュータ上で動作します。 –

+0

私はそう思います、私はxaml ListViewコード 'ItemsSoruce = {Binding}'を追加し、c# 'listViewData.DataContext = extension.LastData;'で設定しました。それでも正しい数の項目が表示されますが、 ':'ではなく 'key:value'のみが表示されます。あなたは.net4.5ベータ版でそれをテストしましたか? –

関連する問題