9

Windows 8リリースプレビュー(最新のパッチがインストールされている)を使用しているWinRT / C#XAMLMetroアプリで奇妙な問題が発生しました。を使用していComboBoxます。その値ItemsSourceSelectedValueはViewModelのプロパティにバインドされています。

<ComboBox SelectedValue="{Binding MySelectedValue, Mode=TwoWay}"
          ItemsSource="{Binding MyItemsSource, Mode=OneWay}"
          Width="200" Height="30" />

背後にあるコード:

public MainPage()
{
    this.InitializeComponent();

    DataContext = new TestViewModel();
}

そして、TestViewModel文字列を使用した、の非常に単純な定義:

public class TestViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private IEnumerable<string> _myItemsSource = new List<string>
        {
            "Test Item 1",
            "Test Item 2",
            "Test Item 3"
        };
    public IEnumerable<string> MyItemsSource
    {
        get { return _myItemsSource; }
    }

    private string _mySelectedValue = "Test Item 2";
    public string MySelectedValue
    {
        get { return _mySelectedValue; }
        set
        {
            _mySelectedValue = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MySelectedValue"));
            }
        }
    }
}

今、私はこの単純な解決策がうまくいくはずだと思いました...しかし、私がアプリを起動すると、SelectedValue="Test Item 2"は表示されず、ComboBoxは空のままになります。ブレークポイントを設定することで、ビューのを設定したときに、バインドされた値MyItemsSourceMySelectedValueがビューモデルから正しく取得されることに気付きDataContextました。このアクションの後、ComboBox.SelectedValueプロパティは実際にはに設定されますが、表示され"Test Item 2"ません。また、UIでユーザーアクションによってComboBoxで選択された値を変更すると、変更された値がComboBoxに表示され、それに応じてモデルの表示プロパティが更新されることに気付きました。MySelectedValueしたがって、ビューモデルプロパティの最初の視覚化を除いて、すべてが正常に機能しているように見えます。私はそれについて本当に必死になっています...

DisplayMemberPathこれが最も単純な例ですが、元の場所では、エンティティ全体をComboBox、設定、およびにバインドしたいと思いましたSelectedValuePath。残念ながら、同じ問題が発生します。

4

2 に答える 2

30

私の例で問題を見つけました。XAMLマークアップでは、プロパティの前にプロパティを定義SelectedValueましItemsSource。このように両方の定義を交換すると、次のように機能します。

<ComboBox ItemsSource="{Binding MyItemsSource, Mode=OneWay}"
      SelectedValue="{Binding MySelectedValue, Mode=TwoWay}"
      Width="200" Height="30" />

これは本当に奇妙で迷惑です。今私は知りたいです:これはバグですか、それとも仕様によるものですか?XAMLで定義されたプロパティの順序に関係なく、コントロールが機能するはずなので、これはバグだと思います。

于 2012-07-14T12:29:19.873 に答える
2

これは機能するソリューションです:ここで見つけることができますhttps://skydrive.live.com/?cid=b55690d11b67401d&resid=B55690D11B67401D!209&id=B55690D11B67401D!209

<ComboBox Width="300" Height="32" HorizontalAlignment="Left" DisplayMemberPath="Name"
                  VerticalAlignment="Top" ItemsSource="{Binding PersonCollection}" 
                  SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"></ComboBox>

ViewModleクラスは

public class ViewModel:BaseViewModel
    {
        private Person selectedPerson;
        public Person SelectedPerson {
            get { return this.selectedPerson; }
            set { this.selectedPerson = value;
            this.RaisePropertyChanged("SelectedPerson");
            }
        }
        public ObservableCollection<Person> PersonCollection { get; set; }

        public ViewModel()
        {
            this.PersonCollection = new ObservableCollection<Person>();
            this.PopulateCollection();

            //setting first item as default one
            this.SelectedPerson = this.PersonCollection.FirstOrDefault();
        }

        private void PopulateCollection()
        {
            this.PersonCollection.Add(new Person { Name="Oscar", Email="oscar@sl.net" });
            this.PersonCollection.Add(new Person { Name = "Jay", Email = "jay@sl.net" });
            this.PersonCollection.Add(new Person { Name = "Viral", Email = "viral@sl.net" });
        }
    }
于 2012-07-14T09:45:23.580 に答える