【问题标题】:WPF, MVVM Populate combobox using another combobox selected itemWPF、MVVM 使用另一个组合框选定项填充组合框
【发布时间】:2013-05-29 13:14:13
【问题描述】:

我有 2 个组合框,第一个的选定项目需要更改第二个的 itemsource 而它没有。

这是我的 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}"/>

而这就是viewModel的相关属性和功能...

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&lt;int,string&gt;...

如果我不单击(单击而不更改所选项目,只需单击)组合框,源列表就可以了。我点击它的那一刻,列表根本没有改变..

【问题讨论】:

    标签: wpf data-binding mvvm combobox population


    【解决方案1】:

    问题是,您绑定了Dictionary&lt;int, string&gt;,它没有通知视图有关更改的机制。视图无法意识到它必须更新。

    所以我想,如果您像这样更改您的 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}"/>
    

    【讨论】:

    • 感谢您的回答。我做了你告诉我的事情,但它仍然以同样的方式行事。有什么我想念的财产吗?
    • [...] 它的行为方式仍然相同。 我希望这不是真的,如果你真的改变了一些东西的话。 ;o) 虚拟机的状态是否符合您的预期,或者可能有什么不正确的地方?您是否收到任何BindingExpression 错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多