none
Как при выборе элемента из WPF ComboBox присвоить значения полей из выбранного элемента свойствам в классе, в котором определён источник привязки для этого ComboBox? RRS feed

  • Вопрос

  • В приложении есть следующий класс:

    /// <summary>
    /// Класс FutSessContentsRecord представляет структуру
    /// записи из справочника торгуемых инструментов
    /// </summary>
    class FutSessContentsRecord
    {
            #region Fields
    
            /// <summary>
            /// Уникальный числовой идентификатор инструмента
            /// </summary>
            private Int32 _isin_id;
            /// <summary>
            /// Символьный описатель инструмента.
            /// </summary>
            private String _short_isin;
            /// <summary>
            /// Полное наименование инструмента.
            /// </summary>
            private String _name;
            /// <summary>
            /// Цена инструмента.
            /// </summary>
            private Decimal _last_cl_quote;
            
            #endregion
    
            #region Properties
    
            /// <summary>
            /// Уникальный числовой идентификатор инструмента
            /// </summary>
            public Int32 IsinId
            {
                get { return _isin_id; }
                set { _isin_id = value; }
            }
            /// <summary>
            /// Символьный описатель инструмента.
            /// </summary>
            public String ShortIsin
            {
                get { return _short_isin; }
                set { _short_isin = value; }
            }
            /// <summary>
            /// Полное наименование инструмента.
            /// </summary>
            public String InstrumentName
            {
                get { return _name; }
                set { _name = value; }
            }
            /// <summary>
            /// Цена инструмента.
            /// </summary>
            public Decimal LastClQuote
            {
                get { return _last_cl_quote; }
                set { _last_cl_quote = value; }
            }
        
    }
    
    #endregion

    Приложение пишется по шаблону MVVM. В нём есть model (модель), view (представление) и view model (модель представления), служащая контекстом данных (DataContext) для представления. В классе модели представления есть коллекция типа ObservableCollection

    /// <summary>
    /// Cправочник инструментов, назначенных к торгам в сессию.
    /// </summary>
    private ObservableCollection<FutSessContentsRecord> _futSessContents;
    
    /// <summary>
    /// Возвращает справочник инструментов, назначенных к торгам в сессию.
    /// </summary>
    public ObservableCollection<FutSessContentsRecord> FutSessContents
            {
                get
                {
                    if (_futSessContents == null)
                        _futSessContents = new ObservableCollection<FutSessContentsRecord>();
                    return _futSessContents;
                }
            }

    Как вы видете - элементами этой коллекции являются экземпляры FutSessContentsRecord. В разметке части view приложения я описываю комбобокс, привязанный к этой коллекции. Он должен в своём выпадающем списке (dropdown) показывать значения из поля FutSessContentsRecord.InstrumentName и в своём текстовом окошечке после выбора элемента из dropdown также должен показывать значение этого же поля выбранного элемента. Кроме того в классе модели представления есть следующие открытые свойства:

    /// <summary>
    /// Уникальный числовой идентификатор торгуемого фьючерса
    /// (не отображается в представлении).
    /// </summary>
    public Int32 IsinId
    {
        get { return _futuresTradeModel.IsinId; }
        set { _futuresTradeModel.IsinId = value; }
    }
    /// <summary>
    /// Символьный код торгуемого фьючерса
    /// (отображается в представлении).
    /// </summary>
    public String ShortIsin
    {
        get { return _futuresTradeModel.ShortIsin; }
        set
        {
            if (value == _futuresTradeModel.ShortIsin) return;
                    _futuresTradeModel.ShortIsin = value;
            base.OnPropertyChanged("ShortIsin");
        }
    }
    /// <summary>
    /// Цена торгуемого фьючерса
    /// (не отображается в представлении).
    /// </summary>
    public Double Price
    {
        get { return _futuresTradeModel.Price; }
        set { _futuresTradeModel.Price = value }
    }

    (_futuresTradeModel - это у меня такое имя у класса модели). Я очень бы хотел, что бы при выборе элемента списка, из этого выбранного элемента записывались бы соответственно значения его свойств: IsinId, ShortIsin, LastClQuote в свойства модели представления: IsinId, ShortIsin и Price соответственно. Для этого я, в представлении (view) описываю ComboBox следующим образом:

    <ComboBox x:Name="TradedFutures_Cmb" Grid.Row="3" Grid.Column="1" IsReadOnly="True"
                       ItemsSource="{Binding Path=FutSessContents}"
                       DisplayMemberPath="InstrumentName"
                       SelectedValuePath="IsinId"/>
    Но здесь самое большее - при выборе элемента списка будет ещё выбираться уникальный числовой идентификатор инструмента и всё. И это в лучшем случае. Как тут можно добиться присваивания значений свойств выбранного элемента (при его выборе) в свойства модели представления?




    • Изменено TownSparrow 6 июля 2013 г. 10:04

Ответы