2013-06-03 199 views
1

我有2個組合框,第一個選定項目需要更改第二個項目源,但它沒有。WPF,MVVM使用另一個組合框選定項目填充組合框

這是我的XAML ...

<ComboBox Grid.Column="1" ItemsSource="{Binding StationsList}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Path=StationTarget, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding MonitorsList}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Path=MonitorTarget, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

這是相關屬性和視圖模型的功能...

public ObservableCollection<StationViewModel> Stations 
{ 
    get { return _stations; } 
    set 
    { 
     if (_stations == value) 
      return; 
     _stations = value; 
     SetStationList(); 
     OnPropertyChanged("Stations"); 
    } 
} 

public Dictionary<int,string> StationsList 
{ 
    get 
    { 
     return _stationsList; 
    } 
    set 
    { 
     if (_stationsList == null) 
      return; 
     _stationsList = value; 
     OnPropertyChanged("StationsList"); 
    } 
} 

public ObservableCollection<MonitorViewModel> Monitors 
{ 
    get { return _monitors; } 
    set 
    { 
     if (_monitors == value) 
      return; 
     _monitors = value; 
     SetMonitorsList(); 
     OnPropertyChanged("Monitors"); 
    } 
}   

public Dictionary<int, string> MonitorsList 
{ 
    get { return _monitorsList; }    
} 

public int StationTarget 
{ 
    get 
    { 
     return _mc.StationTarget ; 
    } 
    set 
    { 
     if (_mc.StationTarget == value) 
      return; 
     _mc.StationTarget = value; 
     SetMonitorsList(); 
     SetStatus(); 
     OnPropertyChanged("StationTarget"); 
     OnPropertyChanged("MonitorsList"); 
    } 
} 

private void SetStationList() 
{ 
    _stationsList.Add(0,"OFF"); 
    foreach (StationViewModel station in Stations) 
     _stationsList.Add(Convert.ToInt32(station.SerialCode),station.StationName); 
} 

private void SetMonitorsList() 
{    
    _monitorsList.Clear(); 
    _monitorsList.Add(0, "OFF"); 
    _filterdMonitors.Clear();         
    _filterdMonitors = _monitors.Where(x => x.StationSerial == StationTarget).ToObservableCollection<MonitorViewModel>(); 

    foreach (MonitorViewModel monitor in _filterdMonitors) 
     _monitorsList.Add(Convert.ToInt32(monitor.Channel), monitor.MonitorName);       
} 

我的2個來源是Dictionary<int,string> ...

如果我不點擊(點擊沒有改變選擇的項目,只需點擊)組合框,源列表是好的。當我點擊它,列表根本沒有改變..

回答

3

那麼問題是,你已經綁定了Dictionary<int, string>,它沒有一個機制來通知視圖的變化。視圖不能意識到,它必須更新。所以我想,如果你想這樣改變你的XAML,那麼如果你之後改變了SetMonitorsList(),它可能會起作用。它應該修改Monitors的內容。

<ComboBox Grid.Column="1" ItemsSource="{Binding Stations}" DisplayMemberPath="Value" 
      SelectedValuePath="Key" SelectedValue="{Binding Path=StationTarget, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Monitors}" 
      DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Path=MonitorTarget, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
+0

謝謝你的回答。我做了你告訴我的事情,它仍然以同樣的方式行事。有沒有我想念的東西或別的東西? –

+0

* [...]它仍然採用相同的方式。*我希望,如果你真的改變了某些東西,那不是真的。 ; o)虛擬機的狀態是否像您期望的那樣,或者可能是不正確的?你是否收到任何'BindingExpression'錯誤? – DHN

相關問題