2011-02-18 69 views
2

我有什麼應該是一個非常簡單的綁定,但我看到的問題是,而不是顯示三家公司(company_list是一個列表,其中公司包含一個company_id綁定),我看到該窗口彈出公司_list中的company_id只有第一個。我有其他的綁定似乎工作正常,並在其他一些情況下,我看到我已經使用ItemSource而不是DataContext,但是當我使用它時,我得到「Items集合必須爲空之前使用ItemsSource」。我已經在stackoverflow,msdn和其他地方廣泛搜索了一個簡單的答案,並且看到了大部分非常複雜的解決方案,但我一直無法理解/應用。C#/ XAML/WPF綁定部分工作,只顯示列表中的第一項

當出現在我的窗口,它具有:

公司A

,它應該有:

公司A
CompanyB
CompanyC

這是company_list的內容(是的,在調試器中驗證)。建議感激!代碼和XAML遵循。

ReadMasterCompanyList(); // populates a_state.company_list with 3 companies 
    // display company list dialog 
    CompanySelect cs_window = new CompanySelect(); 
    cs_window.CompanyListView.DataContext = a_state.company_list; 
    // fails: cs_window.CompanyListView.ItemsSource = a_state.company_list; 
    cs_window.Show(); 

而且從COMPANY選擇的XAML:

<Grid> 
    <ListView IsSynchronizedWithCurrentItem="True" 
     x:Name="CompanyListView" 
     SelectionMode="Single" SelectionChanged="CompanyListView_SelectionChanged"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="Height" Value="30"/> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListViewItem Content="{Binding Path=company_id}"></ListViewItem> 
    </ListView> 
</Grid> 

回答

0

首先,設置的DataContext只有cs_window.Show後()。其次,您在ListView的XAML中作爲子項的ListViewItem就是爲什麼您只能看到一個ListViewItem。

第三,可能會更好地工作(和會更MVVM-ISH)如果您在XAML定義的ItemsSource,像這樣:

<ListView ItemsSource="{Binding Path=company_list}" ...> 

這使得ListView的容器或其他一些祖先的a_state在DataContext後的元件。

+0

我能夠按照建議在cs_window.Show()之後設置ItemSource。涼!我會按照建議嘗試XAML中的ItemsSource;曾嘗試過,但還有其他錯誤,那麼以及:-) – Ken 2011-02-18 16:55:38

0

的問題是,你定義在你的XAML代碼一個ListViewItem的。你不應該這樣做。
嘗試是這樣的:

<Grid> 
    <ListView IsSynchronizedWithCurrentItem="True" 
     x:Name="CompanyListView" 
     SelectionMode="Single" SelectionChanged="CompanyListView_SelectionChanged"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="Height" Value="30"/> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Content={Binding Path=company_id}/> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 
2

我將設置的ItemsSource ListView控件,而不是DataContext的,無論是在代碼隱藏:

cs_window.CompanyListView.ItemsSource = a_state.company_list; 

或結合:

<ListView ItemsSource="{Binding company_list}"> 

,然後設置ListView控件的ItemTemplate中代替。

... 
<ListView.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding company_id}" /> 
    </DataTemplate> 
</ListView.ItemTemplate> 
... 

我也考慮使用MVVM design pattern可測試性和關注點分離,並期待在使用PascalCase您的屬性名稱。

另外,除非你特別想要一個ListView,否則我會使用一個ListBox。

+0

謝謝,這有助於。只需要注意一下,「TextBlock」似乎沒有Content屬性,它是Text =「{Binding company_id}」。 – Ken 2011-02-18 16:52:17

相關問題