Привязка свойств подкласса MVVM - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть проблема с цепочкой классов привязки, мой listView не будет обновлять данные: здесь

упрощенный код:

  private ObservableCollection<NewPosition> _ListPosition;
      public ObservableCollection<NewPosition> ListPosition
    {
                        get { return _ListPosition; }
                       set
                        {

                           _ListPosition = value;
                           OnPropertyChanged("ListPosition");

                        }
                    }

       public class NewPosition
               { 
              public int ID { get; set; }
               public PosStatus Status { get; set; }
                public Trade buyTrade { get; set; }
               public Trade SellTrade { get; set; }

             }

       public class Trade 
      {
                  public double DealPrice {get ; set}

      }

теперь представление

<ListView Grid.Row="1" Background="#FF232426" ItemsSource="{Binding 
 assetsPointCollection.ListPosition}"
     Foreground="#FFF2F3F7" Margin="0,10" FontSize="10" >
     <ListView.View>
         <GridView> 
<GridViewColumn  Header="Price" Width="80" DisplayMemberBinding="{Binding buyTrade.DealPrice}" />
     <GridViewColumn  Header="SellPrice" Width="80"
     DisplayMemberBinding="{Binding SellTrade.DealPrice}" />  
                             </GridView>
                        </ListView.View>
                    </ListView>
               </Grid>

Поэтому, когда я впервые устанавливаю dealprice и добавляю его в коллекцию, он показывает значение задания и списка просмотра;

 NewPosition thisPos = new NewPosition();
   var trade = new Trade()
                {                   
                    DealPrice = 1000,
                 }
  thisPos.buyTrade = trade;
   ListPosition.Add(thisPos);

проблема в том, что когда я хочу позже установить NewPosition.Selltrade.Dealprice GUI не будет показывать изменения (он работает в консоли)

 pos.SellTrade = new Trade{DealPrice = 1200};

так, каков "элегантный способ реализации такого кода?"

1 Ответ

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

Это связано с тем, что NewPosition и Trade не реализуют INotifyProperyChange , как ваша модель представления.Система управления окнами не сравнивает значения объекта и полагается на что-то, сообщающее, что свойство изменилось.

Для того, чтобы изменение было получено, вам придется удалить и снова добавить NewPosition, так как ObservableCollection не уведомляет о любых изменениях.

Вы можете посмотреть на MvvmLite , чтобы найти простую структуру, которая поможет вам.

Пример использования ObservableObject из MvvmLite, который реализуетINotifyPropertyИзменено для вас:

public class NewPosition : ObservableObject
{ 
    private int _id;
    public int ID {
        get => _id;
        set => Set(ref _id, value); 
    }

    private PosStatus _status;
    public PosStatus Status {
        get => _status;
        set => Set(ref _status, value);
    }

    private Trade _buyTrade;
    public Trade buyTrade { 
        get => _buyTrade;
        set => Set(ref _buyTrade, value);
    }

    private Trade _sellTrade;
    public Trade SellTrade { 
        get => _sellTrade;
        set => Set(ref _sellTrade, value);
    }
}

public class Trade : ObservableObject
{
    private double _dealPrice;
    public double DealPrice {
        get => _dealPrice;
        set => Set(ref _dealPrice, value);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...