2012-05-18 86 views
0

我有一個名爲SeiveList的ObservableCollection。我想從列表中選擇所有的SeiveIdSize(除了最後一個沒有用),並且爲Combobox設置DataContext。我加WPF:從ObservableCollection獲取特定字段

seiveCmb.DataContext = GlobalUtils.SeiveList; 
seiveCmb.DisplayMemberPath = // WHAT SHOULD GO HERE. hOW TO ONLY SHOW SeiveIdSize 

// XML 
<ComboBox Name="seiveCmb" ItemsSource="{Binding}" Grid.Column="1" Grid.Row="1" Margin="2" SelectedIndex="0" ></ComboBox> 

市價修改Sebastian的建議:目前,我只是嘗試了與列表下拉框。 我的鈦硅分子篩類:

public class Seive : INotifyPropertyChanged 
{ 
    // Other Members 
    private bool isSelected; 

      public bool IsSelected 
    { 
     get { return isSelected; } 
     set 
     { 
      isSelected = value; 
      OnPropertyChanged("IsSelected"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string p) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(p)); 
    } 
} 

在我窗口的.xaml文件:

<Window.Resources> 
    <CollectionViewSource Source="{Binding Path=comboSeives}" 
          x:Key="comboSeivesFiltered" 
          Filter="ComboSeiveFilter">    
    </CollectionViewSource> 
</Window.Resources> 

<ComboBox Name="seiveCmb" ItemsSource="{Binding Source={StaticResource   comboSeivesFiltered}}" DisplayMemberPath="SeiveIdSize" 
         Grid.Column="1" Grid.Row="1" Margin="2" SelectedIndex="0" 
         ></ComboBox> 

窗口cs文件:

public ObservableCollection<Seive> comboSeives { get; set; } 

    // Initial original data in Window_Loaded method 
    comboSeives = GlobalUtils.SeiveList; 

    public void ComboSeiveFilter(object sender, FilterEventArgs e) 
    { 
     Seive sv = e.Item as Seive; 
     // Add items those is != "TOTAL" and isSelected == false 
     if (sv.SeiveIdSize != "TOTAL" && sv.IsSelected == false) 
      e.Accepted = true; 
     else 
      e.Accepted = false; 
    } 

如果ID是 「總」 或isSelected是假的(即沒有添加到網格中),那麼只返回true,它會加起來。初始的所有記錄都有isSelected = false。

這是我從你的解釋和this site的幫助中瞭解到的。並已實施這一點。但在運行時,我沒有看到組合框中的任何東西。我試圖在過濾器方法中調試添加break,但它永遠不會到達那裏。你能指出我從上面的代碼中弄錯了什麼嗎?

aNY幫助被讚賞。

謝謝

+1

你累了嗎'seiveCmb.DisplayMemberPath =「SeiveIdSize」;'? – nemesv

+0

你可以顯示一個「SeiveList」的例子元素嗎? – StaWho

+0

@nemesv,是的,也添加了DisplayMemberPath。查看組合框,如果xaml。但沒有結果。 – Tvd

回答

1

我知道你希望你的收藏被過濾,刪除一個元素。一種方法是在Window.Resources中創建一個CollectionView並應用一個過濾器方法 - 如演示並解釋here

<Window.Resources> 
    <CollectionViewSource Source="{Binding Path=SeiveList}" 
          x:Name="seiveListFiltered" 
          Filter="MyFilter"> 

    </CollectionViewSource> 
</Window.Resources> 

你的代碼暗示你的情況下,集合是窗口的DataContext。這必須改變,以符合新資源:

<ComboBox ItemsSource="{Binding Source={StaticResource seiveListFiltered}}"/> 

注意,這將填補你的組合框,類似於您SeiveItem.ToString()的輸出項目 - 方法(其實我不知道類名項目)。使用DisplayMemeberPath -Property設置要顯示的屬性的名稱。

<ComboBox DisplayMemberPath="SeiveIdSize" ItemsSource="{Binding Source={StaticResource seiveListFiltered}}"/> 
+0

好的答案 - 在代碼中使用linq等進行節拍過濾,我一直在想:) – Charleh

+0

@Sebastian,非常感謝。有了這個資源,我正在尋找更多的東西。我有SeiveList包含所有Seive obj的數據。我有一個部分,在其中選擇seiveId(Combobox),添加其詳細信息,並將數據列入數據網格中。一旦我將數據添加到網格中,我希望將seiveId從組合列表中刪除。從網格刪除記錄時,該seiveId應再次添加到組合列表中。這就是我要找的。這將重新驗證我的密碼,以關注添加了哪個ID。你能指導我嗎? – Tvd

+0

@Tvd,這很簡單。首先,讓你的Seive obj(或一個ViewModel包裝它)屬性「IsAdded」。然後生成兩個CollectionViewSource:其中一個過濾掉那些具有IsAdded == true且位於相同值爲false的地方。將您的組合框綁定到一個集合,將DataGrid綁定到另一個集合。請注意,您的Seive對象必須實現INotifyPropertyChanged,以便過濾器注意值的更改。因此,無論何時更改IsAdded,過濾器都會執行它們的操作,並且UI會收到一個CollectionChanged事件。 –