Как я могу использовать combobox с wpf mvvm - PullRequest
0 голосов
/ 21 марта 2020

У меня есть таблица сотрудников. и поле местоположения в таблице сотрудников. Я должен использовать combobox, чтобы фильтровать это. Если я выбираю «Местоположение» только в выпадающем списке, местоположение должно отображаться на экране, если я выбираю только местоположение «B». На экране должны появляться люди. Это мои записи xaml и ComboBox.ParticularEntries - это все мои записи (вместе места A и B)

Инициализированные конкретные записи, такие как:

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

И класс модели EntryReportParticular:

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 ParticularEntries

<DataGrid  
    ItemsSource="{Binding ParticularEntries}" 
    AutoGenerateColumns="False" 
    IsReadOnly="True" 
    RowHeaderWidth="0" 
    GridLinesVisibility="All"
    HorizontalGridLinesBrush="WhiteSmoke"
    VerticalGridLinesBrush="WhiteSmoke" 
    Margin="4">

И это мой комбинированный список с командой.

<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: ComboBox:

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, что-то изменилось. Как я могу это исправить и как я могу фильтровать по местоположению? Что я должен изменить в пользовательском интерфейсе или других, чтобы сделать это?

1 Ответ

1 голос
/ 21 марта 2020

Ваш код в 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...