SelectedValue,SelectedIndex与数据绑定到ComboBox c ++ / cx XAML Metro应用程序时出现问题

时间:2012-12-08 00:56:36

标签: xaml data-binding combobox microsoft-metro c++-cx

如何在以下代码中使用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个元素。调用SelectedElement属性的get()方法,但set()方法不调用。我通过放置一个断点来检查这个。我做错了什么?

此外,是否可以将Platform :: Array ^绑定到ComboBox? 我尝试使用Platform :: Array&lt; Platform :: String ^&gt; ^以及Platform :: Array&lt; int&gt; ^我无法让它工作。 STL容器也没有用。可以绑定到组合框的其他可能容器是什么?

1 个答案:

答案 0 :(得分:2)

更改

SelectedIndex="{Binding Path=SelectedElement}" 

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

如果您希望UI更新ViewModel,则需要双向绑定。

您只能在绑定中使用WinRT组件(ref类/结构,枚举类)。使用Platform :: Collections :: Vector在用于绑定时通常是正确的选择,特别是因为它还实现了IObservableVector。 STL容器不起作用,因为它们不能穿过ABI。