2011-04-20 86 views
0

我敢肯定這是一個用戶控件的DataContext問題,但我只是沒有看到它:WPF:在用戶控件綁定一個ListView顯示沒有任何項目

這是我的XAML:

<UserControl x:Class="WFT.Controls.DetailsBox" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wft="clr-namespace:WFT.Controls" > 

    <wft:CaptionedBox Caption="Details" Margin="1" > 
     <ListView ItemsSource="{Binding Map}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding Key}" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Value}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </wft:CaptionedBox> 
</UserControl> 

這是後臺代碼:

public partial class DetailsBox : UserControl 
{ 
    ObservableCollection<KeyValuePair<string, string>> m_Map = 
     new ObservableCollection<KeyValuePair<string, string>>(); 

    public ObservableCollection<KeyValuePair<string, string>> Map 
    { get { return m_Map; } } 

    public DetailsBox() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    public void Initialize(List<string> map) 
    { 
     IEnumerable<int> range = Enumerable.Range(0, map.Count); 

     m_Map = new ObservableCollection<KeyValuePair<string, string>>(
      range.Where(r => 0 == r % 2 && map[ r + 1 ].Trim() != "N/A") 
      .Select(r => new KeyValuePair<string, string>(map[ r ], map[ r + 1 ])).ToList()); 

    } 
} 

在運行時,地圖有八個項目,但沒有顯示在ListView。在獨立測試應用程序中,它可以與DataContext="{Binding RelativeSource={RelativeSource Self}}"一起使用,但是作爲UserControl,這不起作用。正如你上面看到的,我甚至還試圖在構造函數中設置DataContext = this

謝謝!

+0

是ListView集的DataContext?乍一看,一切看起來不錯,但我看不到DataContext是如何設置的。 – 2011-04-20 14:47:58

+0

我編輯了問題以顯示DataContext。我從教程中複製這個...有沒有一種方法來指定這是爲ListView本身?實際上,它是在XAML標題中定義的。 – 2011-04-20 14:53:53

+0

我很確定問題出在DataContext中;我的xaml是一個UserControl; RelativeSource綁定在我的窗口中工作,但不在UserControl中(編輯原始問題)。我試過的某些東西已經立即關閉VS2008! – 2011-04-21 18:07:50

回答

0

我始終沒弄清楚如何設置的DataContext在XAML,但我得到的東西做的工作如下:

在XAML,我加x:Name="listview"到ListView。

然後,在後面的代碼,我把財產,地圖,進入一個DependencyProperty

public ObservableCollection<KeyValuePair<string, string>> Map 
{ 
    get { return (ObservableCollection<KeyValuePair<string, string>>)GetValue(MapProperty); } 
    set { SetValue(MapProperty, value); } 
} 

public static DependencyProperty MapProperty = DependencyProperty.Register("Map", 
    typeof(ObservableCollection<KeyValuePair<string, string>>), 
    typeof(DetailsBox), 
    new PropertyMetadata(new ObservableCollection<KeyValuePair<string, string>>())); 

去除DataContext = this;從構造,並添加listview.DataContext = Map;初始化,加載地圖後。