Связывание константы Collection с ComboBox и SelectedItem с TextBox - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в MVVM в WPF, и у меня возникает следующая проблема:

Я пытаюсь получить два ComboBox, каждый из которых привязан к тому же свойству ObservableCollection<TwoProperties> DList, что и ItemsSource, и синхронизирован SelectedItem, поэтому я написал это в своем XAML

<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 из SelectedD должны быть редактируемыми , однако ObservableCollection<TwoProperties> _dList должен оставаться постоянным / только для чтения и не изменять свои значения.

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

Но , когда я редактирую TextBoxes и, следовательно, SelectedD, также _dList меняет свои значения , что не то, что я хочу.

Я надеюсь, что смогу объяснитьмоя проблема.Я уверен, что упускаю что-то простое здесь.

1 Ответ

0 голосов
/ 25 апреля 2018

Это можно легко реализовать, изменив режим привязки для текстовых полей одним из следующих способов:

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