2017-07-29 84 views
0

來自新手的基本問題。我一直在堅持這一點,並已閱讀了很多關於SO的材料和幾個類似的問題;希望不是完全重複的問題。盡我所知,我簡化了代碼。爲什麼這個ListView不會隨着綁定屬性的改變而改變?

我想使ListView顯示一個過濾的ObservableCollection)屬性(作爲ItemsSource?),基於組合框中的選擇。 具體而言,哪些「會議」具有與此相關的「協調員」。

我在運行時看不到任何輸出數據錯誤,調試顯示屬性正確更新,但ListView保持空白。我試圖避免視圖上的任何代碼隱藏,目前沒有任何代碼隱藏。

謝謝!

public class ViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<Meeting> meetings; 
    public ObservableCollection<Meeting> Meetings 
    { 
     get 
     { 
      return meetings; 
     } 
     set 
     { 
      meetings = value; 
      OnPropertyChanged("ListProperty"); 
      OnPropertyChanged("Meetings"); 
     } 
    } 

    private string coordinatorSelected; 
    public string CoordinatorSelected 
    { 
     get 
     { 
      return coordinatorSelected; 
     } 
     set 
     { 
      coordinatorSelected = value; 
      Meetings = fakeDB.Where(v => v.CoordinatorName == CoordinatorSelected) as ObservableCollection<Meeting>; 
     } 
    } 

    private ObservableCollection<string> comboProperty = new ObservableCollection<string> { "Joe", "Helen", "Sven" }; 
    public ObservableCollection<string> ComboProperty 
    { 
     get 
     { 
      return comboProperty; 
     } 
    } 

    private ObservableCollection<Meeting> fakeDB = new ObservableCollection<Meeting>() { new Meeting("Joe", "Atlas"), new Meeting("Sven", "Contoso"), new Meeting("Helen", "Acme") }; 
    public ObservableCollection<Meeting> ListProperty 
    { 
     get 
     { 
      return Meetings; 
     } 
    } 

    public class Meeting 
    { 
     public string CoordinatorName { get; set; } 
     public string ClientName { get; set; } 
     public Meeting(string coordinatorName, string clientName) 
     { 
      CoordinatorName = coordinatorName; 
      ClientName = clientName; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

XAML:

<Window.Resources> 
    <local:ViewModel x:Key="VM"></local:ViewModel> 
</Window.Resources> 
<DockPanel DataContext="{StaticResource ResourceKey=VM}"> 
    <ComboBox Margin="10" ItemsSource="{Binding ComboProperty}" SelectedItem="{Binding CoordinatorSelected}" DockPanel.Dock="Top"/> 
    <ListView Margin="10" ItemsSource="{Binding ListProperty, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="ClientName"/> 
</DockPanel> 

更新:

這似乎表明,拉姆達返回一個會議對象,但分配給會議失敗。這可能是鑄造中的錯誤嗎?

再次感謝。

+0

選項這裏不需要,只使用源工程 - '的ItemsSource = 「{結合的ListProperty,UpdateSourceTrigger =的PropertyChanged}」' – gnivler

+1

注意,'UpdateSourceTrigger = PropertyChanged'對單向綁定沒有影響。它控制TwoWay或OneWayToSource綁定如何更新其源屬性。 – Clemens

回答

1

我相信我已經發現了兩個解決方案,以同樣的問題。錯誤指出@Clemens也是解決方案的一部分。如果我將ListProperty和Meetings更改爲IEnumerable,會議屬性問題即告解決。或者,這種方法不改變類型,我相信它將過濾的序列作爲參數調用集合的構造函數。

set 
{ 
    coordinatorSelected = value; 
    var filteredList = fakeDB.Where(v => v.CoordinatorName == coordinatorSelected); 
    Meetings = new ObservableCollection<Meeting>(filteredList); 
    OnPropertyChanged("ListProperty"); 
} 
3

在觸發PropertyChanged事件之前,您總是必須更改屬性的後臺字段。否則,該事件的消費者在讀取該財產時仍會獲得舊值。

更改會議屬性的setter方法是這樣的:

public ObservableCollection<Meeting> Meetings 
{ 
    get 
    { 
     return meetings; 
    } 
    set 
    { 
     meetings = value; 
     OnPropertyChanged("ListProperty"); 
     OnPropertyChanged("Meetings"); 
    } 
} 
+0

謝謝你的時間。很好,我糾正了這個錯誤。我認爲在setter中分配給Meetings會有問題 - 我將更新問題以修復代碼幷包含調試器的屏幕截圖。我認爲這可能是一個鑄造問題,但它看起來是對的。 – gnivler

相關問題