0

WP7でのバインドに問題があり、役立つ例やブログが見つかりません。私のアプリケーションにはViewModelがあり、メインページ(リスト)から編集/詳細ページに移動するときに、同じページに正しくバインドされたListPickerデータとObjectデータを表示する際に問題が発生します。私はなんとかこの仕事をすることができましたが、これのベストプラクティスを見つけたいと思います。

たとえば、私はクラスを持っています:

public class Person
    {
        public string Name { get; set; }
        public string Gender { get; set; }
    }

このクラスは、私のビューモデルでも参照されています。

public Person selectedPerson;
private Person _person
{
    get { return _person; }
    set
    {
        _person= value;
        NotifyPropertyChanged("selectedPerson");
    }
}

Detail.xamlページがあります:

<StackPanel x:Name="PersonEditPanel">
    <TextBox x:Name="NameTextBox" Text="{Binding Name}" />
    <TextBox x:Name="GenderTextBox" Text="{Binding Gender}" />
</Stackpanel>

そして、私の背後にあるコードには、次のものがあります。

private void PhoneApplicationPage_Loaded(object sender, EventArgs e)
{
    DataContext = App.ViewModel.selectedPerson;
}

上記は問題ありませんが、ユーザーエクスペリエンスを向上させるために、Gender属性にListPickerを追加したいと思います。

これを実現するために、新しいクラスを追加します。

public class TypeList
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

そして、観察可能なコレクションをViewModelに追加します。

private ObservableCollection<TypeList> _PersonGenderTypeList;
    public ObservableCollection<TypeList> PersonGenderTypeList
    {
        get { return _PersonGenderTypeList; }
        set
        {
            _PersonGenderTypeList = value;
            NotifyPropertyChanged("PersonGenderTypeList");
        }
    }

私は多くのオプションを試しましたが、正しくバインドされた個人名と性別リストを選択して画面に(同時に)入力できる場所を見つける唯一の方法は次のとおりです。

private void PhoneApplicationPage_Loaded(object sender, EventArgs e)
{
    DataContext = App.ViewModel.selectedPerson;
    GenderTypeListPicker.ItemsSource = App.ViewModel.PersonGenderTypeList;
}

これは実際のハックのように感じられ、おそらくベストプラクティスではありません。私はここで何かが欠けていますか?もしそうなら、これを達成するためのより良い方法はありますか?

4

1 に答える 1

1

私はあなたのコードをハックとして分類しません、それは単純で仕事をします。MVVMパターンを利用して、選択した人物と性別の両方を含む、ページを「裏付ける」ビューモデルを作成できます。

public PersonDetailsViewModel
{
  public Person SelectedPerson {get;set;}
  public ObservableCollection<TypeList> GenderList {get;set;}
}

次に、このビューモデルのインスタンスをビューのインスタンスとして設定しDataContext、XAMLでさまざまなUIコントロールをバインドできます。

ただし、前に述べたように、現在のコードに厳密な問題はありません。

于 2012-07-30T08:28:00.520 に答える