0

我在从视图绑定到 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();
        }
    }

一些帮助将不胜感激

4

1 回答 1

0

当我尝试从加载组合框项的方法中获取值时,该值始终是默认值

哪个是组合框很困惑ItemsSource,如果Depcombo是 ComboBox ,当您调用方法时ItemsSource,您已经传递了一个新的列表实例。ItemsSourceGetDepCombo

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>

IfEmpItems是 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);
    }

看起来问题出在重新加载视图时。有没有办法在不重新加载的情况下刷新视图。重新加载的值时

private bool isStatusBtnChecked = true;

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

为真,但按钮 isChecked 属性为假;

于 2020-04-21T02:33:36.450 回答