2012-03-21 65 views
3

我遇到了一個問題,在ListView的ItemTemplate中獲取綁定工作。我的綁定目標是一個KeyValuePair。下面的代碼:在ItemVemplate中綁定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鍵和值是行不通的。我在metro風格的應用程序下工作.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,和它的工作就像一個魅力。

所以我最好的猜測是:

1)您需要使用要通知的集合(在變化的一個ObservableCollection否則項目可能是在這裏,但ListView控件不會刷新,因爲它不知道集合已經改變)。

2)你應該避免直接設置集合:使其只能讀取並逐個添加項目,而不是設置集合。 (或在集合的setter中提高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)); 
      } 
     } 
    } 
+0

我嘗試了兩種,但它沒有使它工作。 List的Setter已經調用了PropertyChanged(),ObservableCollection並沒有幫助。逐一設置項目也無濟於事。我修改了我的代碼並編輯了你的集合LvItems而不是LastData,它也沒有顯示出來。 – 2012-03-21 13:32:43

+0

您是否正確設置了DataContext?我發佈的例子與您的確切XAML一起在我的電腦上發佈。 – 2012-03-21 13:35:15

+0

我這麼認爲,我添加到我的xaml ListView代碼'ItemsSoruce = {Binding}'並在c#中設置''listViewData.DataContext = extension.LastData;'。仍然顯示正確數量的項目,但只有':'不是'鍵:值'。你用.net4.5 beta測試過嗎? – 2012-03-21 13:51:07