Связывание ComboBox с двумя разными свойствами из двух разных классов в MVVM C # - PullRequest
0 голосов
/ 28 ноября 2018

Мне пришлось переписать мою проблему.Часть в кавычках ниже - это сообщение перед редактированием.

У меня есть два свойства: capacitiveCurrent и ShowProductSum.До каких-либо изменений в моем приложении MVVM я связывал capacitiveCurrent со значением, которое было установлено в конструкторе - это всегда было 15.

capacitiveCurrent находится в другом классе LineOut, код:

свойство CapitiveCurrent

    private double _capacitiveCurrent;
    public double CapacitiveCurrent
    {
        get { return _capacitiveCurrent; }
        set
        {
            if (_capacitiveCurrent != value)
            {
                _capacitiveCurrent = value;
                OnPropertyChanged("_capacitiveCurrent");
            }
        }
    }

Второе свойство размещено вMainWindow.xaml.cs код:

ShowProductSum

        public double _showProductSum;
    public double ShowProductSum
    {
        get { return _showProductSum; }
        set
        {
            if (_showProductSum != value)
            {
                _showProductSum = value;
                OnPropertyChanged("ProductSum");
            }
        }
    }

Настройка и получение логической схемы ShowProductSum завершена .. почти.Но что я ожидаю от этих двух свойств, так это то, что я хочу, чтобы они отображались в ComboBox.Это то, что у меня есть:

    private ObservableCollection<double> _comboBoxCapacitiveCurrent = new ObservableCollection<double>();
    public ObservableCollection<double> ComboBoxCapacitiveCurrent
    {
        get
        {
            _comboBoxCapacitiveCurrent.Clear();
            _comboBoxCapacitiveCurrent.Add(lineWy.capacitiveCurrent);
            _comboBoxCapacitiveCurrent.Add(ShowProductSum);
            return _comboBoxCapacitiveCurrent;
        }
        set
        {
            if (_comboBoxCapacitiveCurrent != value)
            {
                _comboBoxPradPojemnosciowy = value;
                OnPropertyChanged("ComboBoxCapacitiveCurrent");
            }
        }
    }
    public double SelectedItem { get; set; }

ComboBox :

      <DataGridTemplateColumn Header="Capacitive Current " HeaderStyle="{StaticResource ZwarcioweHeaderStyle}">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
         <ComboBox 
                  ItemsSource="{Binding Path=ComboBoxCapacitiveCurrent}"
                  SelectedValue="{Binding Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          >
                  </ComboBox>
         </DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn>

CombBox присутствует, но в выпадающем списке в выпадающем списке ничего нет.поле со списком.Все реализует интерфейс INotifyPropertyChanged.

Заранее спасибо.

Я абсолютный новичок в MVVM C #.Я пытаюсь связать два свойства, которые находятся в двух разных классах.

Первое свойство - public double capacitiveCurrent { get; set; } из одного класса, и до этого я использовал это свойство для просмотра его с обычной привязкой - было показано инициализированное значение.

 public double productLengthShortCircuitCurrent
    {
    get { return length* capacitiveShortCircuitCurrentwithGround; }
    set { }
    } is a combination of the two `length` and `capacitiveShortCircuitCurrentwithGround` both with getters and

setters.

ComboBox находится внутри

`<DataGridTemplateColumn Header"ABC">
  <DataGridTemplateColumn.CellTemplate
   <DataTemplate>
    <ComboBox .../>`

Я пытаюсь сделать так, чтобы эти два свойства были перечислены в ComboBox и:

  1. Мне нужно capacitiveCurrent чтобы редактировать из вида,
productLengthShortCircuitCurrent должно быть суммой всех установленных значений (таким образом, произведение суммы) .. я должен вызвать функцию, чтобы сделать это, а затем привязать ее к ComboBox?

** Мне удалось установить и получить это свойство, и я получил приведенное ниже свойство ProductSum. Все дело в отображении двух свойств в ComboBox.

Я действительно запутался.Искал ответ два дня, не придумал идеи.Может быть, я не знаю, как это сделать, но ... Пытался связать эти два свойства с интерфейсом с чем-то вроде public IConnectedProperties Categories и личным списком _category с помощью getter и setter.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Исправьте это в вашем сеттере:

_comboBoxPradPojemnosciowy = value; // binding will loose the instance

Используйте «Очистить ()» и «Добавить ()».При изменении экземпляра - привязка все еще ищет в старом экземпляре.

_comboBoxPradPojemnosciowy.Clear();
foreach (var item in value)
{
    _comboBoxPradPojemnosciowy.Add(item);
}

OnPropertyChanged("ComboBoxCapacitiveCurrent");

Если часть ShowProductSum работает, возможно, это единственное, что вам нужно исправить.

Привязки ComboBox:

ItemsSource="{Binding Path=ComboItems}"   
SelectedItem="{Binding Path=SelectedItem}"

Свойства и поля каретки:

private ObservableCollection<double> comboItems = new ObservableCollection<double>();
public ObservableCollection<double> ComboItems{
    get
    {
        this.comboItems.Clear();
        this.comboItems.Add(prad_pojemnosciowy);
        this.comboItems.Add(iloczyn_dlugosc_pojemnościowy_prąd_zwarcia_z_ziemią);
        return this.comboItems;
    } 
    set;
}
public double SelectedItem{get;set}

Не забудьте уведомить свойство, измененное для "ComboItems" в установщиках двух свойств.

0 голосов
/ 28 ноября 2018

Поместите два экземпляра ваших классов в один класс viewmodel и свяжите его с соответствующим значением.«ViewModels» используются для связи между представлениями и моделями.Поэтому поместите всю свою логику для взаимодействия с представлением в модель представления.Затем вы должны привязать вашу модель представления к представлению, и ваш текст данных будет установлен на объекте.Если вы хотите связать свою собственность в экземпляре, вы можете использовать Instance.Property для привязки

Возможно , эти помогут вам.Для базового объяснения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...