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

所有客户视图模型:

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对象是什么?
如果AllCustomersViewModel在原始 xml 文件中CustomerViewModel抽象出客户数据的集合,则抽象出集合中的每个客户。

抽象是什么样的或它的类型是什么?
CustomerViewModel暴露(这是.net行话)一个名为FirstNametype的属性stringAllCustomersViewModel公开一个名为AllCustomerstype的属性ObservableCollection<CustomerViewModel>

现在我有了要显示的数据,我将注意力转移到View (xaml)
我正在尝试在我的WizardWindowView.

由于我必须显示一个列表而不仅仅是列表中的一两个元素,因此我需要一个 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 回答