如何使用MVVM体系结构在WPF中设置组合框值

问题描述 投票:0回答:2

[我在WPF MVVM架构中创建了POC。在其中使用了组合框控件,您可以在下面的代码中看到。

 <ComboBox Name="DeptCombo" Grid.Row="4" Grid.Column="1" ItemsSource="{Binding DepartmentList,Mode=TwoWay}" SelectedItem="{Binding Path=CurrentDepartment,Mode=TwoWay}" DisplayMemberPath="DepartmentName">
</ComboBox>

这里CurrentDepartment是Department类的属性。

一切都很好,我填充了该组合,将组合值保存在数据库中,但是我面临的唯一问题是,我无法在该组合中设置保存的数据库值。那。请帮助我。

c# mvvm combobox wpf-controls
2个回答
0
投票

添加UpdateSourceTrigger

  SelectedItem="{Binding Path=CurrentDepartment,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

代码应该看起来像这样:

  class ViewModel: INotifyPropertyChanged
{
    public ObservableCollection<string> Datas { get; set; } = new ObservableCollection<string>()
    {
        "FF", "AA", "BB"
    };

    private string currentItem;
    public string CurrentItem
    {
        get => currentItem;
        set
        {
            currentItem = value;
            OnPropertyChanged("CurrentItem");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop="")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
    }
}

[型号示例:PersonModel.cs:

   class PersonModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}

ViewModel.cs:

 class ViewModel: INotifyPropertyChanged
    {
        public ObservableCollection<PersonModel> Datas { get; set; } = new ObservableCollection<PersonModel>()
        {
            new PersonModel(){Age = 10, Name="Tom"},
            new PersonModel(){Age = 10, Name="Mark"},
        };

        private PersonModel currentItem;
        public PersonModel CurrentItem
        {
            get => currentItem;
            set
            {
                currentItem = value;
                OnPropertyChanged("CurrentItem");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop="")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }
    }

MainWindow.xaml:

 <ComboBox ItemsSource="{Binding Datas}" SelectedItem="{Binding CurrentItem, UpdateSourceTrigger=PropertyChanged}"
              Height="100" Width="100">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <TextBlock Text="{Binding Age}"/>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

0
投票

部门类别:

 public class Department : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertychanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; OnPropertychanged("Id"); }
    }

    private string departmentName;
    public string DepartmentName
    {
        get { return departmentName; }
        set { departmentName = value; OnPropertychanged("DepartmentName"); }
    }

    private bool isActive;
    public bool IsActive
    {
        get { return isActive; }
        set { isActive = value; OnPropertychanged("IsActive"); }
    }
}

查看模型:

private ObservableCollection<Department> departmentList;
    public ObservableCollection<Department> DepartmentList
    {
        get { return departmentList; }
        set { departmentList = value; OnPropertyChanged("DepartmentList"); }
    }

 private Department currentDepartment;
    public Department CurrentDepartment
    {
        get { return currentDepartment; }
        set { currentDepartment = value; OnPropertyChanged("CurrentDepartment"); }
    }

 private void DepartmentPop()
    {
        DepartmentList = new ObservableCollection<Department> 
                (objDepartmentService.GetAll());
    }
© www.soinside.com 2019 - 2024. All rights reserved.