首页 > 解决方案 > 将常量 Collection 绑定到 ComboBox 和 SelectedItem 到 TextBox

问题描述

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

我尝试拥有的是两个 ComboBoxes,每个都绑定到与 synchronized相同的ObservableCollection<TwoProperties> DList属性,所以我在我的 XAML 中写了这个ItemsSourceSelectedItem

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

使用此视图模型

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;
    }
}

我还想要两个文本框来显示当前SelectedItem同步组合框的属性。属性Property1和应该是Property2编辑的,但是应该保持不变/只读并且不改变它的值。SelectedDObservableCollection<TwoProperties> _dList

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

但是,当我编辑 TextBoxes并因此编辑 SelectedD 时,_dList 也会更改其值,这不是我想要的。

我希望我能解释我的问题。我确定我在这里遗漏了一些简单的东西。

标签: c#wpfmvvmdata-bindingcombobox

解决方案


这可以通过将 TextBoxes 的绑定模式更改为以下一种方式轻松实现:

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

因此,当您更改 textBox 值时,更改不会反映回 Observable 集合对象。

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

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

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

    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}" />

推荐阅读