代码之家  ›  专栏  ›  技术社区  ›  Sebastian

将常量集合绑定到ComboBox并将SelectedItem绑定到TextBox

  •  0
  • Sebastian  · 技术社区  · 6 年前

    我是WPF中MVVM的新手,我有以下问题。

    我尝试的是两个组合框,每个绑定到相同的 ObservableCollection<TwoProperties> DList 属性为 ItemsSource 和已同步 SelectedItem ,所以我在我的XAML中写了这个

    <ComboBox ItemsSource="{Binding DList}" DisplayMemberPath="Property1" SelectedItem="{Binding SelectedD}" />
    <ComboBox ItemsSource="{Binding DList}" DisplayMemberPath="Property2" SelectedItem="{Binding SelectedD}" />
    

    使用此viewmodel

    public class ViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<TwoProperties> _dList =
            new ObservableCollection<TwoProperties> {
                 new TwoProperties(1,"one"),
                 new TwoProperties(2,"two")
            };
    
        public ObservableCollection<TwoProperties> DList
        {
            get { return _dList; }
            set { _dList = value; OnPropertyChanged("DList"); }
        }
    
        private TwoProperties _selectedD;
        public TwoProperties SelectedD
        {
            get { return _selectedD; }
            set { _selectedD = value; OnPropertyChanged("SelectedD"); }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
    

    哪里

    public class TwoProperties
    {
        public double Property1 { get; set; }
        public string Property2 { get; set; }
    
        public TwoProperties (double p1, string p2)
        {
            Property1 = p1;
            Property2 = p2;
        }
    }
    

    我还想有两个文本框,显示当前 选择编辑项 同步组合框的。属性 Property1 Property2 属于 SelectedD 应该是 可编辑 然而 ObservableCollection<TwoProperties> _dList 应保持常量/只读,且不更改其值。

    <TextBox Text="{Binding SelectedD.Property1}" />
    <TextBox Text="{Binding SelectedD.Property2}" />
    

    但是 当我编辑文本框时 因此也选择了EDD _dList更改其值 ,这不是我想要的。

    我希望我能解释我的问题。我肯定我错过了一些简单的东西。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mahmoud Heretani    6 年前

    通过将文本框的绑定模式更改为以下一种方式,可以轻松实现这一点:

        <TextBox Text="{Binding SelectedD.Property1,Mode=OneWay}" />
        <TextBox Text="{Binding SelectedD.Property2,Mode=OneWay}" />
    

    因此,当您更改文本框值时,更改不会反映回可观察的集合对象。

    请注意,您可以通过如下修改方法来消除视图模型OnPropertyChanged中的神奇字符串:

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

    然后,您可以在视图模型中任何属性的setter中调用它,而无需传递属性名称,如下所示:

        private TwoProperties _selectedD;
        public TwoProperties SelectedD
        {
            get { return _selectedD; }
            set { _selectedD = value; OnPropertyChanged(); }
        }
    

    编辑2: 更新我的绑定和视图模型,以获取视图模型中已编辑的值

    查看模型更新:

    private double? editPropertyOne;
        public double? EditPropertyOne
        {
            get { return editPropertyOne; }
            set
            {
                editPropertyOne = value;
                OnPropertyChanged();
            }
        }
    
        private string editPropertyTwo;
        public string EditPropertyTwo
        {
            get { return editPropertyTwo; }
            set
            {
                editPropertyTwo = value;
                OnPropertyChanged();
            }
        }
    
        private TwoProperties _selectedD;
        public TwoProperties SelectedD
        {
            get { return _selectedD; }
            set
            {
                _selectedD = value; OnPropertyChanged();
                if (_selectedD != null)
                {
                    EditPropertyOne = _selectedD.Property1;
                    EditPropertyTwo = _selectedD.Property2;
                }
            }
        }
    

    Xaml更改:

        <TextBox Text="{Binding EditPropertyOne}" />
        <TextBox Text="{Binding EditPropertyTwo}" />