【问题标题】:Using SelectedItem and SelectedValue in one control在一个控件中使用 SelectedItem 和 SelectedValue
【发布时间】:2020-07-31 18:56:11
【问题描述】:

各位程序员!

我有一个应用,其中 ComboBox 绑定到 EF Core 实体列表。 我发现当我将它绑定到 SelectedItem 时,它不会在断开连接的情况下返回正确的项目。但是,当同时使用 SelectedValue 和 SelectedItem 时,它似乎工作正常。这是一个好方法吗?父对象同时拥有“int Id”和导航属性。所以 SelectedItem 绑定到 Navigation Property,SelectedValue 绑定到“int Id”。

C#:

            public Person()
            {
              int Id {get; set;}
              string Name {get; set;}
            }

XAML:

     <ComboBox
           DisplayMemberPath="Name"
           SelectedValuePath="Id"
           ItemsSource="{Binding People}"
           SelectedValue="{Binding SelectedPerson, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
           SelectedItem="{Binding SelectedPersonNavigation", UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />

【问题讨论】:

  • 你没有说清楚你的意思是什么它不会返回正确的项目。但是请看一下SelectedItemSelectedValue 之间的区别。你不需要在推测中同时使用这两个,一般来说,如果你使用SelectedValue,你通常也需要使用SelectedValuePathstackoverflow.com/questions/4902039/…
  • 请注意,对于这两个属性,在 Binding 上设置 UpdateSourceTrigger=PropertyChanged 是没有意义的,因为这已经是默认设置。对于 OneWay 绑定,无论如何它没有意义,因为 UpdateSourceTrigger 仅在 TwoWay 或 OneWayToSource 绑定中有效。
  • 抱歉,我会更准确地说:我正在从数据库加载父实体,也是人员列表。我试图实现的是当我加载这些对象时,我希望 Combobox 显示来自父实体的选定人员。另一个想法是在调用 SaveChanges 并仅更改 SelectedValue 时,我以不同的 Id 和 Navigation Property 结尾。我想我可以通过在 SaveChanges 调用之前调用 Navigation Property = null 并仅使用 SelectedValue 来实现相同的目的
  • 请编辑原帖并显示上述代码。

标签: c# wpf xaml ef-core-3.1


【解决方案1】:

找到解决办法

  public class Person
    {
        public int Id {get; set;}
        string Name {get; set;}
    }

    public class ViewModel:INotifyPropertyChanged
    {
        private int _personId;
        public ObservableCollection<Person> People { get; set; }

        public int PersonId
        {
            get => _personId;
            set
            {
                _personId = value; 
                OnPropertyChanged(nameof(PersonId));
                OnPropertyChanged(nameof(SelectedPerson));
            }
        }

        public Person SelectedPerson
        {
            get => People.First(x => x.Id == PersonId);
        }

        public event PropertyChangedEventHandler? PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2012-06-23
    • 2010-10-14
    • 2021-10-15
    相关资源
    最近更新 更多