Проблемы с SelectedValue, SelectedIndex при привязке данных к приложению ComboBox c++/cx XAML Metro

Как я могу использовать значение выбранного элемента ComboBox в следующем коде?

C++:

namespace testtesttest
{
[Windows::UI::Xaml::Data::Bindable]
public ref class Wrapper sealed : Windows::UI::Xaml::Data::INotifyPropertyChanged
{
public:
    Wrapper()
    {
        // the index of the selected element of the combobox when the application starts
        m_selectedElement = 2;

        m_myStringArray = ref new Platform::Collections::Vector<int>(3);
        // 1, 2, and 4 in the combobox list
        m_myStringArray->SetAt(0,1);
        m_myStringArray->SetAt(1,2);
        m_myStringArray->SetAt(2,4);
    }

    virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler^ PropertyChanged;


    property Windows::Foundation::Collections::IVector<int>^ MyStringArray
    {
        Windows::Foundation::Collections::IVector<int>^ get() { return m_myStringArray; }
    }

    property int SelectedElement
    {
        int get() { return m_selectedElement; }
        void set(int value) { m_selectedElement = value; RaisePropertyChanged("SelectedElement"); }
    }
protected:
    void RaisePropertyChanged(Platform::String^ propertyName)
    {
        PropertyChanged(this, ref new Windows::UI::Xaml::Data::PropertyChangedEventArgs(propertyName));
    }
private:
    Platform::Collections::Vector<int>^ m_myStringArray;
    int m_selectedElement;
};
}

XAML:

<TextBlock HorizontalAlignment="Left" 
           Height="73" Margin="50,436,0,0" 
           TextWrapping="Wrap" 
           Text="{Binding Path=SelectedElement}" 
           VerticalAlignment="Top" 
           Width="200"/>
<ComboBox ItemsSource="{Binding Path=MyStringArray}" 
          SelectedIndex="{Binding Path=SelectedElement}"  
          HorizontalAlignment="Left" 
          Height="50" Margin="369,50,0,0" 
          VerticalAlignment="Top" Width="286"/>

Я проверил другие привязки, и они работали. Я правильно устанавливаю DataContext. m_selectedElement = 2 в конструкторе устанавливает выбранный элемент в поле со списком на 3-й в списке. Метод get() свойства SelectedElement вызывается, а метод set() — нет. Я проверил это, поставив точку останова. Что я делаю неправильно?

Кроме того, можно ли привязать Platform::Array^ к ComboBox? Я пробовал использовать Platform::Array ‹ Platform::String ^>^, а также Platform::Array ‹ int>^, но у меня не получилось. Контейнеры STL также не работали. Каковы другие возможные контейнеры, которые могут быть привязаны к выпадающему списку?


person balauru    schedule 08.12.2012    source источник


Ответы (1)


Изменять

SelectedIndex="{Binding Path=SelectedElement}" 

to

SelectedIndex="{Binding Path=SelectedElement, Mode=TwoWay}"

Вам нужна двусторонняя привязка, если вы хотите, чтобы пользовательский интерфейс обновлял вашу ViewModel.

Компоненты WinRT можно использовать только в привязках (ссылочные классы/структуры, перечисляемые классы). Использование Platform::Collections::Vector обычно является правильным выбором, когда он используется для привязки, особенно потому, что он также реализует IObservableVector. Контейнеры STL не работают, потому что они не могут перемещаться по ABI.

person K Mehta    schedule 08.12.2012
comment
Спасибо. Это сработало. Я сделал другие тесты связывания, и они работали в обоих направлениях без указания режима, поэтому я предположил, что TwoWay был неявным. - person balauru; 08.12.2012
comment
Нет, привязки не неявно двусторонние в WinRT. Все они по умолчанию используют OneWay. Вы уверены, что ваши тесты привязки работали в обоих направлениях? Кроме того, если ответ работает, соглашение состоит в том, чтобы принять его, щелкнув большую галочку слева от ответа. - person K Mehta; 08.12.2012
comment
нет, ты прав. Я не связывал в обе стороны. Я просто менял свойство, когда нажимал кнопку. А я и не знал про галочку...мой первый вопрос. Я бы тоже проголосовал за это, но у меня нет репутации. Спасибо - person balauru; 08.12.2012