Проблема с привязкой к свойству в проекте MVPM uwp - PullRequest
0 голосов
/ 20 апреля 2020

У меня проблема с привязкой из представления к свойству Viewmodel. (UWP)

<AppBarToggleButton Label="Active" Icon="People"
                                    IsChecked="{x:Bind ViewModel.IsStatusBtnChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                    Click="{x:Bind ViewModel.empStautsBtnClicked}"/>

private bool isStatusBtnChecked = true;

    public bool IsStatusBtnChecked
    {
        get { return isStatusBtnChecked; }
        set { Set(ref isStatusBtnChecked, value); }
    }

Когда я пытаюсь получить значение из метода для загрузки элементов комбинированного списка, значение всегда по умолчанию значение

private List<string> depcombo;

    public List<string> Depcombo
    {
        get { return depcombo; }
        set
        {
            if (depcombo != value)
            {
                depcombo = value;
                OnPropertyChanged("Depcombo");
            }
        }
    }
    public async void GetDepCombo()
    {
        List<string> _dep = new List<string>();
        var data2 = await SqlServerDataService.GetAllEmployeesAsync();
        var depResult = (from emp in EmpItems
                         where emp.Status == IsStatusBtnChecked
                         select emp.Department).Distinct();
        foreach (var item in depResult)
        {
            if (item != null)
            {
                _dep.Add(item);
            }
        }
        Depcombo = _dep;
    }

Когда я загружаю данные для Employyes, все работает нормально

 public async Task LoadDataAsync(MasterDetailsViewState viewState)
    {
        EmpItems.Clear();
        var data = await SqlServerDataService.GetAllEmployeesAsync();
        data.Where(em => em.Status == IsStatusBtnChecked).ToList().ForEach(p => EmpItems.Add(p));
        if (viewState == MasterDetailsViewState.Both)
        {
            Selected = EmpItems.FirstOrDefault();
        }
    }

Некоторая помощь будет высоко оценена

1 Ответ

0 голосов
/ 21 апреля 2020

Когда я пытаюсь получить значение из метода для загрузки элементов комбинированного списка, оно всегда является значением по умолчанию

Это сбивает с толку то, что является комбинированным списком ItemsSource, если Depcombo - это ComboBox ItemsSource, Вы передали новый экземпляр списка ItemsSource при вызове метода GetDepCombo.

Depcombo = _dep;

Итак, нам нужно установить режим связывания как OneWay (OneTime по умолчанию), который может ответить на изменение экземпляра объекта.

<ComboBox
    Margin="0,120,0,0"
    ItemsSource="{x:Bind MainViewModel.Depcombo, Mode=OneWay}"
    >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Если EmpItems - это ComboBox ItemsSource, и это тип ObservableCollection. Когда вы звоните LoadDataAsync, EmpItems очищают элементы, а затем добавляют новые элементы. И эта обработка не изменяет объект экземпляра EmpItems. он может работать в одноразовом режиме.

<ComboBox Margin="0,120,0,0" ItemsSource="{x:Bind MainViewModel.EmpItems}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>


<AppBarToggleButton Label="Active" Icon="People"
                                            x:Name="empStatusBtn"
                                            IsChecked="{x:Bind ViewModel.IsStatusBtnChecked, Mode=TwoWay}"
                                  Click="{x:Bind ViewModel.empStautsBtnClicked}"/>

public async void empStautsBtnClicked()
    {
        await LoadDataAsync(MasterDetailsViewState.Both);
    }

Похоже, проблема в том, что представление перезагружается. Есть ли способ обновить sh вид без перезагрузки. При перезагрузке значение

private bool isStatusBtnChecked = true;

    public bool IsStatusBtnChecked
    {
        get { return isStatusBtnChecked; }
        set
        {
            if (isStatusBtnChecked != value)
            {
                isStatusBtnChecked = value;
                OnPropertyChanged("IsStatusBtnChecked");
            }
        }
    }

равно true, но свойство isChecked кнопки равно false;

...