我如何在wpf mvvm中使用组合框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何在wpf mvvm中使用组合框相关的知识,希望对你有一定的参考价值。

我有一个员工表。员工表中的位置和位置字段。我必须使用组合框进行过滤。如果我仅在组合框中选择“ A位置”,则应该在屏幕上显示A位置人员。这是我的xaml条目和ComboBox。ParticularEntries是我的所有条目(A和B位置在一起)初始化的ParticleEntry像这样:

private IEnumerable<EntryReportParticular> _particularEntries;
        public IEnumerable<EntryReportParticular> ParticularEntries
        
            get  return _particularEntries; 
            set  Set(ref _particularEntries, value); 
    

和EntryReportSpecial模型类:

public class EntryReportParticular : BindableItem
    
        private Employee _employee;
        public Employee Employee
        
            get  return _employee; 
            set  Set(ref _employee, value); 
        

        private DateTime _entry;
        public DateTime Entry
        
            get  return _entry; 
            set  Set(ref _entry, value, () => OnPropertyChanged(nameof(Duration))); 
        

        private DateTime _exit;
        public DateTime Exit
        
            get  return _exit; 
            set  Set(ref _exit, value, () => OnPropertyChanged(nameof(Duration))); 
        

        public TimeSpan Duration  get  return Exit - Entry;  

        private Region _region;
        public Region Region
        
            get  return _region; 
            set  Set(ref _region, value); 
        
    

这是我的xaml特殊条目

这是我的命令组合框。

ComboBox ItemsSource="Binding Locations" SelectedItem ="Binding SelectedLocation">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                        <i:InvokeCommandAction Command="Binding LocationFilterCommand"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </ComboBox>

这是我与ViewModel相关的部分:组合框:

private string _selectedLocation;
        public string SelectedLocation
        
            get  return _selectedLocation; 
            set
            
                _selectedLocation = value;
                OnPropertyChanged("SelectedLocation");
                Trace.WriteLine(SelectedLocation);
            
        

        private ObservableCollection<string> _locations;
        public ObservableCollection<string> Locations
        
            get  return _locations; 
            set
            
                _locations = value;
                OnPropertyChanged("Locations");
            


public EntryReportViewModel()//Constructor
        
            Locations = new ObservableCollection<string>()
            
                "A Location","B Location"
            ;

LocationFilterCommand(根据位置过滤而不带按钮)

#region LocationFilterCommand

private DelegateCommand _locationFilterCommand;
public DelegateCommand LocationFilterCommand

    get  return _locationFilterCommand ?? (_locationFilterCommand = new DelegateCommand(CanLocationFilter, LocationFilter)); 


private bool CanLocationFilter()


    if (ParticularEntries == null || DailyEntries == null || MonthlyEntries == null)
        return false;

    return true;

private void LocationFilter()

   ParticularEntries.Select(pg => pg.Region.Location == _selectedLocation);
   MonthlyEntries.Select(pg => pg.Employee.CostCenter.Location == _selectedLocation);


#endregion

我做到了。我的ComboBox具有A和B位置,但是当我选择A或B位置时,任何更改。如何解决此问题以及如何根据位置进行过滤?我应该在UI或其他方面进行哪些更改?谢谢您的帮助。

答案

您在LocationFilter中的代码完全没有意义。

ParticularEntries.Select(pg => pg.Region.Location == _selectedLocation);

它返回一个IEnumerable<bool>,但从未分配。

如果要过滤,则必须使用Where

但是即使您将代码更改为

ParticularEntries = ParticularEntries.Where(pg => pg.Region.Location == _selectedLocation);

您将看到一个变化,但是当您选择其他位置时,下一次您将面临下一个问题。

解决方案

您需要一个集合,其中所有未过滤的项目都存储在一个私有字段中,并将其用于过滤。

private IEnumerable<EntryReportParticular> _allEntries;

private IEnumerable<EntryReportParticular> _particularEntries;
public IEnumerable<EntryReportParticular> ParticularEntries

    get  return _particularEntries; 
    set  Set(ref _particularEntries, value); 


private void LocationFilter()

   ParticularEntries = _allEntries
       .Where(pg => pg.Region.Location == _selectedLocation)
       .ToList();

以上是关于我如何在wpf mvvm中使用组合框的主要内容,如果未能解决你的问题,请参考以下文章

WPF 基于组合框选择使用 MVVM 改变窗口布局

WPF,MVVM从字典中填充级联组合框

在 MVVM 中的 Datagrid 中绑定 WPF 组合框不保存更改

选择组合框时设置文本框的属性 WPF XAML

WPF MVVM:组合框 SelectedValue 绑定

使用 MVVM 重置组合框选定项目