2014-04-04 73 views
0

我正在努力弄清楚WPF和C#的數據綁定和項目源,並且我錯過了一些東西,當涉及到進行適當的綁定連接時。其結果是一個運行時錯誤:當我按下按鈕時試圖添加一些東西到ListView中

Cannot find source for binding with reference 'ElementName=SettingsWindow'. BindingExpression:Path=teams; DataItem=null; target element is 'ListView' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

代碼本身是非常簡單的(我認爲):

SettingsWindow.xaml:

<Window x:Class="Bridge.SettingsWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Settings" Height="480" Width="600"> 
    ... 
    <Button Grid.Column="0" Grid.Row="0" Content="Add Team" Click="ClickAddTeam"/> 
    <ListView ItemsSource="{Binding}" Grid.Column="0" Grid.Row="1"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="Foreground" Value="{Binding team.color}" /> 
      </Style> 
     </ListView.ItemContainerStyle> 
    </ListView> 
    ... 

</Window> 

SettingsWindow.xaml.cs:

public partial class SettingsWindow : Window 
{ 
    public TeamList teams { get; set; } 

    public SettingsWindow() 
    { 
     teams = TeamManager.Instance().teamList; // persists in a different class 
     this.DataContext = this.teams; 
     InitializeComponent(); 
    } 

    private void ClickAddTeam(object sender, RoutedEventArgs e) 
    { 
     TeamManager manager = TeamManager.Instance(); 
     Team toAdd = manager.GetSampleTeam(teams.Count); 
     Console.WriteLine(toAdd.ToString()); 

     teams.Add(toAdd); 

     if(teams.Count == manager.sampleTeams.Count) 
      (sender as Button).IsEnabled = false; 
    } 
} 

Team.cs:

namespace DataTypes 
{ 
    public class Team 
    { 
     public string name; 
     public Brush color; 

     public Team(string name, Brush color) 
     { 
      this.name = name; 
      this.color = color; 
     } 
    } 
} 

現在的工作:

在ClickAddTeam中的WriteLine正在打印正確的數據,所以我知道它的檢索團隊對象正確MyTeamList teams對象獲得的東西添加進去。該按鈕在適當的點擊次數後也被禁用。但是,ListBox始終保持空白。

下一步: 我試圖讓ListBox中的字符串是。名稱,而不是「DataTypes.Team」,併爲文字的前景是球隊的顏色。我如何獲取綁定元素的特定屬性?

任何幫助將不勝感激!

+0

那你有沒有設定一個數據上下文? this.DataContext = this; SettingsWindow是否已定義? – Paparazzi

+0

我認爲'ElementName = SettingsWindow'會以相同的名稱指向代碼隱藏類;是不是這樣?無論如何,我有一些工作,但它顯示「DataTypes.Team」,而不是任何類型的字符串。我該如何使用對象填充列表框,但指定要顯示的字符串? – Benjin

回答

1

綁定僅適用於公共屬性。試圖聲明teams的屬性,而不是場/成員:

public MyTeamList teams { get; set; } 

// OP注:下面這部分將不會編譯,給我一個member names cannot be the same as their enclosing type錯誤。

因爲你被ElementName結合,你需要正確地你的名字Window

<Window x:Class="Bridge.SettingsWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="SettingsWindow" 
     Title="Settings" Height="480" Width="600"> 

[OP注]

只是改變該行ItemsSource="{Binding}"作品展示的東西,但每個項目顯示爲「DataType.Team」而不是正確的字符串。這是要弄清楚的下一個問題。

[/ OP注]

+0

我現在得到這個錯誤:''SettingsWindow':成員名稱不能與它們的封閉類型相同,我猜測它與x:Name標籤有關? '{Binding ElementName = SettingsWindow,Path = teams}'部分,我從其他例子拼湊在一起,但我不完全確定它在做什麼。這是在代碼隱藏中訪問ItemsSource的最佳方式嗎?我問,因爲你說「因爲你有約束力」,好像有一個更常見的選擇。謝謝! – Benjin

+0

劃痕,我得到了一些工作和堅持。下一步是從對象中顯示一個字符串,而不是當前所在的「DataTypes.Team」。我將編輯您的答案以包含所有必要的信息。 – Benjin

+0

你應該編輯你的問題,而不是回答。無論如何,要解決最新的問題,請嘗試在ListView中設置「DisplayMemberPath =」PropertyName「」。 PropertyName是您想要顯示的「Team」的屬性。 – har07

0

這應該是每個問題

一個問題,你需要設置的DataContext
這一點。DataContext = this;

的ItemsSource = 「{綁定路徑=團隊列表}」 的DisplayMemberPath =名稱

而且名稱必須是一個公共屬性(獲取)

相關問題