0

MVVM スタイルのサンプル WPF アプリケーションでデータ バインディングを機能させるのは難しいと感じています。

質問:

次のサンプルには何が欠けていますか?


詳細:

基本構造:

モデル: Customer (実際には関係ありません)

ビューモデル: AllCustomersViewModel

意見: WizardWindowView

構造要素:

VM による公開: AllCustomers (ObservableCollection 型)

ビューに表示: ListView

バインドしたい: ListView <-> AllCustomers


WizardWindowView.xaml:

<Window 
    ...
    ...
    <Window.Resources>
        <CollectionViewSource x:Key="CustomerGroups" Source="{Binding Path=AllCustomers}"/>
    </Window.Resources>
    
    <Grid>
            ...
            ...
            <aw:WizardPage Header="Step 1">
                <ListView
                   ItemsSource="{Binding Source={StaticResource CustomerGroups}}"/>
            </aw:WizardPage>
            ...
            ...
    </Grid>
</Window>

データ バインディングがどのように行われるかを理解しようと、すでに 10 時間以上を費やしており、助けを求める時が来たと感じています。


編集

モデル情報:

データ: customers.xml

モデル: Customer.cs

データアクセス: CustomerRepository.cs

AllCustomersViewModel:

readonly CustomerRepository _customerRepository;
public AllCustomersViewModel(CustomerRepository customerRespository) {...}

編集2

呼び出しのシーケンス:

App.xaml.cs.OnStartup() {.. new MainWindowViewModel("Data/customers.xml")..};

public MainWindowViewModel(string customerDataFile)
{
    _customerRepository = new CustomerRepository(customerDataFile);
    new AllCustomersViewModel(_customerRepository);
}

編集3

データコンテキスト:

App.xaml.cs で:

    MainWindow window = new MainWindow();
    string path = "Data/customers.xml";
    var viewModel = new MainWindowViewModel(path);
    window.DataContext = viewModel;

MainWindow.xaml.cs (分離コード):

private void ShowWizardWindow(object sender, RoutedEventArgs e)
{
    Views.WizardWindowView wizardWindow = new Views.WizardWindowView();
    wizardWindow.DataContext = this.DataContext;
    wizardWindow.Show();
}
4

2 に答える 2

1

ビューのコード ビハインドでは、DataContext = ViewModel public WizardWindowView() { ... DataContext = new MainWindowViewModel(); を設定する必要があります。... } または OnStartup() { App.MainWindow.DataContext = new MainWindowViewModel(); 内 Window の DataContext を設定することは、不足している部分です。

于 2012-05-17T04:06:16.293 に答える
1

ここにいる何人かの人々、同僚、そして最後にいくつかの読書からの支援の後、データバインディングを確立することができました! 実際、私が最初に望んでいたものと比較して単純化されたものです。

申し訳ありませんが、私の答えは最も整理されていないかもしれませんが、理解できると確信しています.


達成した

顧客の名前を表示します。


方法は次のとおりです

顧客の名前を表示したいWizardWindowView(WPF ウィンドウに似た) があります。WizardPageウィザードのいくつかのウィンドウの中のウィンドウです (これも WPF ウィンドウに似ています)。また、質問の編集セクションのようにデータコンテキストを設定しています。

元々の顧客の名前はどこから来たのですか?
ファイルであるデータソースがありxmlます。またAllCustomersViewModel.cs、xml ファイル内のデータを抽象化するクラスもあります。抽象化がどのように行われるかを知りたい場合は、WPF を読む必要があるかもしれません。抽象化は、CustomerViewModelオブジェクトのコレクションです。

さて、これらのCustomerViewModelオブジェクトは何ですか?元の xml ファイルで顧客データのコレクションを抽象化する
場合、コレクション内の各顧客を抽象化します。AllCustomersViewModelCustomerViewModel

抽象化はどのようなものですか、またはそのタイプは何ですか? タイプ のと呼ばれるプロパティ
CustomerViewModelを公開します (これは.net専門用語です) 。タイプ のと呼ばれるプロパティを公開します。FirstNamestringAllCustomersViewModelAllCustomersObservableCollection<CustomerViewModel>

表示するデータができたので、焦点を に切り替えますView (xaml)
顧客の名を に表示しようとしていますWizardWindowView

リスト内の 1 つまたは 2 つの要素だけでなく、リストを表示する必要があるため、リストを表示するための xaml コントロールが必要です ( ListView)。

ソースは何であるべきListViewですか?

<ListView ItemsSource="{Binding Path=AllCustomers}">

リスト内の各項目を表示するには、次のようにします。

            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=FirstName}"></TextBlock>
                </DataTemplate>
            </ListView.ItemTemplate>

概要:

<aw:WizardPage Header="Step 3: Edit/Check Engine (Faulty Customers)">
    <ListView ItemsSource="{Binding Path=AllCustomers}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=FirstName}"></TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</aw:WizardPage>
于 2012-06-14T17:23:54.630 に答える