0

指定された問題に対する WPF の MVVM 方法論。XAMLの「MainView」にコンボボックスがあります。そのコード パートナーは「MainViewModel」であり、「Person」のプロパティを公開します。これは基本的に、データベース内の名前とシードを表す文字列と int を公開するための別個のクラス (POCO クラス) です。次のようにコンボボックスにバインドする ReadOnlyCollection のプロパティを設定します (xaml の上部にあるビューモデルを参照する: xmlns:vm="clr-namespace:(mylocationforviewmodelnamespace))

ItemsSource="{Binding Path=People}"
                    DisplayMemberPath="FirstName"
                    SelectedValuePath="PersonId"

これはうまく機能しますが、次にユーザー コントロール ビューを設定しています。これはそれぞれのビュー モデル コードです。バインディングの ViewModel メソッドについて得られないのは、渡された値をコンストラクターにバインドする方法です。それともそれもできますか?または、「モデル」だけでなく「DataAccess」にも中間クラスを設定する必要がありますか?

私の最終的な目標は、既に適切にバインドされていてうまく機能している値をコンボボックスで選択し、それをビューモデル コードに渡し、ビルド時にビューに関連付けて親フォームにドッキングすることです。コンストラクターをうまく作成し、静的な値を設定して、ビルド時に名前が表示されるようにすることができます。ユーザーコントロールの作成結果にバインドされているコンボボックスの親ビューオブジェクトから値を渡す方法がわかりません。私は多くのことをやろうとしていますが、MVVMメソッドに固執し、これを行う方法を既に知っているコードビハインドでこれを行いたくありません。

大まかにフォローしているMVVMメソッドはこちらです:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

4

1 に答える 1

0

わかった。この例の MainViewModel には、後続のユーザー コントロールのコンストラクターであるプライベート メソッドが含まれています。メイン ウィンドウはコンボボックスに正常にバインドされますが、新しいコンストラクターに関連付ける必要があるコンボボックスのメンバーの詳細が必要です。これを設定し、コンボボックスの XAML 'selected value' の要素にバインドされたプロパティにバインドする必要があります。このプロパティがバインドされていることを認識すると、後でデータバインドされた ViewModelCode の内部メソッドで使用して、渡された Person オブジェクトが必要なものをコンストラクターに通知できます。

私と同じような状況の人がたくさんいますが、違う人がいるので、後で役に立つと思う人がいれば投稿したいと思います. 私が追加する唯一の言葉は、「INotifyPropertyChanged」クラスを継承する必要があると信じているということですが、私の例では、抽象クラスで2クラスの継承レベルが下がっているため、より単純な例を示すためにすべてをやり直す必要はないと感じました。必要なものを手に入れました。

XAML:

<ComboBox Height="30" Width="170" Margin="10" x:Name="combopersons" 
                    FontSize="20"
                    ItemsSource="{Binding Path=People}"
                    DisplayMemberPath="FirstName"
                    SelectedValuePath="PersonId"
                    SelectedValue="{Binding Path=CurrentUser}"  />

田畑:

Person _currentPerson;
        ReadOnlyCollection<Person> _people;
        ObservableCollection<WorkspaceViewModel> _workspaces;

        string _curuser;
        string u = WindowsIdentity.GetCurrent().Name.Split('\\')[1];
        public string CurrentUser { get; set; }

        ExpensesEntities ee = new ExpensesEntities();

public ReadOnlyCollection<Person> People
        {
            get
            {
                if (_people == null)
                {
                    List<Person> persns = this.GetPeople();
                    _people = new ReadOnlyCollection<Person>(persns);
                }
                return _people;
            }
        }

コンストラクタ:

public MainWindowViewModel()
        {
            _curuser = ee.tePersons.Where(n => n.FirstName == u)
                        .Select(x => x.PersonID).FirstOrDefault().ToString();

            CurrentUser = _curuser;
        }

ヘルパー メソッド:

        List<Person> GetPeople()
        {
            //ExpensesEntities ee = new ExpensesEntities();
            return ee.tePersons.Select(x => new Person
                                         {
                                             PersonId = x.PersonID,
                                             FirstName = x.FirstName
                                         }).ToList();
        }


int ConvertToNumber(string s)
        {
            try
            {
                return Convert.ToInt32(s);
            }
            catch (FormatException e)
            {
                return 0;
            }
        }

        void SetCurrentUser()
        {
            int currentID = ConvertToNumber(CurrentUser);

            _currentPerson = ee.tePersons
                               .Where(i => i.PersonID == currentID)
                               .Select(p => new Person
                                                {
                                                    PersonId = p.PersonID,
                                                    FirstName = p.FirstName
                                                }).FirstOrDefault();
        }

CHILD View Model の MainViewModel のコンストラクタ:

    void MoneyEntry()
    {
        SetCurrentUser();
        MoneyEntryViewModel money = new MoneyEntryViewModel(_currentPerson);
        this.Workspaces.Add(money);
        this.SetActiveWorkspace(money);
    }
于 2013-01-08T05:14:48.713 に答える