2011-01-13 81 views
7

我有一個類型項目的觀察集合顯示的ObservableCollection ,我想顯示在一個ListView,但沒有被添加到我的ListView,我真的不明白 獲得一個WPF列表視圖使用數據綁定

我的主窗口。 XAML

  <ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <WrapPanel> 
         <TextBlock Text="{Binding Path=ProjectID}"/> 
         <TextBlock Text="{Binding Path=ProjectName}"/> 
        </WrapPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

我MainWindow.cs

public partial class MainWindow : Window 
{ 
    ObservableCollection<Project> Projects = new ObservableCollection<Project>(); 
    ObservableCollection<Employee> Employees = new ObservableCollection<Employee>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = Projects; 

     Project pro1 = new Project(1, "Swordfish"); 
     Projects.Add(pro1); 
     Employee empMads = new Employee("Mads", 1); 
     Employee empBrian = new Employee("Brian", 2); 
     Employees.Add(empMads); 
     Employees.Add(empBrian); 
    } 

    private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    } 
} 

和我Project.cs它是類文件

[Serializable] 
class Project : INotifyPropertyChanged 
{ 
    public Project(int id, string name) 
    { 
     ID = id; 
     Name = name; 
    } 

    private int id; 
    public int ID 
    { 
     get { return id; } 
     set 
     { 
      id = value; 
      NotifyPropertyChanged("ProjectID"); 
     } 
    } 

    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      name = value; 
      NotifyPropertyChanged("ProjectName"); 
     } 
    } 

    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

但是沒有東西被添加到我的清單我不能看到我缺少它的工作。

我把它作爲一個的ObservableCollection 我做的DataContext =收集 而且我在XAML文件結合

編輯codepart 1:

 public ObservableCollection<Project> Projects { get; set; } 
    public ObservableCollection<Employee> Employees { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Projects = new ObservableCollection<Project>(); 
     Employees = new ObservableCollection<Employee>(); 

     DataContext = Projects; 
+0

想想你可以發佈你如何設置你的DataContext? – Josh 2011-01-13 14:04:47

回答

3

這是因爲您使用綁定路徑像ProjectID而您的Project類有財產IDProjectNameName屬性也是如此。

E: 當您遇到綁定問題時,在visual studio的調試模式下查看Output選項卡以查看數據綁定引擎返回的錯誤非常有用。這些例外通常不會退還給用戶,但您可以在那裏檢查它們。

+0

這工作,但我不能在我的輸出或錯誤列表中看到任何錯誤的方式寫入時。順便說一句,有可能有一個組合框我在同一個XAML文檔數據綁定到另一個列表? – Mech0z 2011-01-13 14:17:17

+0

System.Windows.Data Error:40:BindingExpression path error:'ProjectID'property not found on'object'''Project'(HashCode = 41717140)'。 BindingExpression:路徑=專案編號; DataItem ='Project'(HashCode = 41717140);目標元素是'TextBlock'(Name ='');目標屬性是'文本'(類型'字符串') - 這是我在我的輸出窗口中找到的消息,當我第一次開始你的代碼。是的,可以在運行時更改數據源(我想這就是你要求的),但是在這裏我沒有足夠的空間。我相信你可以在網上找到如何做到這一點。 – Pako 2011-01-13 14:21:16

+0

有用,因爲我不知道VS會輸出數據綁定錯誤。這會減少我的XAML/WPF調試時間,歡呼! – Psytronic 2011-01-13 14:26:39

1

默認情況下,您的成員變量將是私人的。如果您在這裏發佈的是您的實際代碼,那麼XAML無法訪問它。使這些屬性公開:

public ObservableCollection<Project> Projects = new ObservableCollection<Project>(); 
public ObservableCollection<Employee> Employees = new ObservableCollection<Employee>(); 
2

正如指出的那樣,這裏有一些問題。一個讓你作爲一個新的WPF開發的「陷阱」的是,你不能使用成員變量,你必須使用公共屬性:

public ObservableCollection<Project> Projects { get; set; } 
public ObservableCollection<Employee> Employees { get; set; } 

這些,當然需要在構造函數初始化。

一旦你這樣做了,你需要確保集合的屬性與你在ListView上綁定的內容相匹配。

0

貴國的名單必須是公共財產(編輯:除非你設置的DataContext像你這樣......)(public ObservableCollection<Project> Projects {get;}

2.您的通知應該是一樣的實際屬性的名稱:

private int id; 
public int ID 
{ 
    get { return id; } 
    set 
    { 
     id = value; 
     NotifyPropertyChanged("ID"); 
    } 
} 

3.綁定需要是這樣還有:

<TextBlock Text="{Binding Path=ID}"/> 

我想......