我应该为WPF控件编写类吗?

时间:2012-02-26 14:14:17

标签: c# wpf

我有一个网格,我称之为FooHistory。现在我需要大量与此相关的功能,所以我继续创建一个FooHistory类。现在我有一个FooHistory类和一个控件。

在我的MainWindow构造函数中,我创建了这个类的新实例,并将this的实例(即MainWindow)传递给FooHistory类,就像依赖注射。然后,当FooHistory类想要与FooHistory控件进行交互时,我会执行this.mainWindow.FooHistory.Items.Add(...)之类的操作。

我的问题是,这是编写WPF应用程序的推荐方法还是我缺少一些基本方法?

4 个答案:

答案 0 :(得分:1)

如果您的大部分功能都是表示逻辑, 你可以创建一个用户控件(通过子类化UserControl),并有一对.xaml和.xaml.cs文件, 并将您的表示逻辑放在.xaml.cs文件中。

如果大多数FooHistory类功能是业务逻辑(或除了表示之外的任何东西),那么将FooHistory控件与FooHistory类分开是值得的,但在这种情况下,最好为控件定义一个接口,并且使用此接口传递FooHistory instsance对控件的引用。 这样你的FooHistory类就不需要了解任何关于演示的知识 - 甚至不需要知道它是WPF。

如果你可以避免传递一个控件树(例如SomeWindow.ParentControl.ChildControl.Items),它会让你的生活更轻松。

答案 1 :(得分:1)

你所描述的听起来像某种模型 - 视图 - 演示者模式,MVC的一种变体。因为它绝对是一个很好的模式,特别是对于ASP.NET和WinForms,它没有使用WPF的一些核心概念。

您遗失的内容称为数据绑定和命令。最重要的是MVC的新变种 - Model-View-ViewModel (MVVM),有时也称为Presentation Model。粗略解释: 您的窗口称为视图。 Youd Busines Logic封装在模型中。 您创建一个ViewModel类,该类公开一些属性,这些属性是特定于视图的模型表示。 VM还应实现INotifyPropertyChanged以提供一种通知UI有关数据更改的方法。您以相同的方式公开操作 - 通过类型ICommand的属性。 在View的构造函数中,您可以编写类似this.DataContext = new ViewModel()的内容 然后使用{Binding PropName}语法绑定View控件属性和ViewModel。

您可能还想查看MVVM的一些框架,例如 Prism MVVM Light

以下是一些示例:http://rachel53461.wordpress.com/2011/05/08/simplemvvmexample/

答案 2 :(得分:1)

我们为我们的程序使用MVVM方法。虽然细节可能因程序而异,但MVVM通常由3个主要部分构成。

<强>型号: 这是你的数据对象。这可能是商业数据,如

class Account
{
    string Name {get;set;}
    string Address {get;set;
}

但也可以是UI数据,如:

class Window
{
    Point Position {get;set;}
    Size Size {get;set;}
}

这些对象仅用于保存数据。没有事件,没有命令没有方法(这是MVVM的不同解释不同的一点)。

<强>视图模型: 这是为了包装模型并围绕底层模型提供逻辑。此类还用于将业务模型属性转换为可视化的属性。

class AccountViewModel
{
    public AccountViewModel(Account aWrappedModel)
    {
    }

    string Name {get {return Model.Name;} }

    AddressObject Address { get{ return new AddressObject( Model.Address ); }
}

查看:

这是wpf部分,可以是用户控件,自定义控件,窗口,数据窗口等。 尽管有一个共同的信念,但是为了查看后面的代码很好,否则你只需要因为听说视图不允许有代码而弯曲后备词。

现在通常的方法是创建一个模型,一个或多个视图模型,并在视图中将这些视图模型设置为DataContext。有时你需要一个DataTemplate来显示给定的数据,比如我们的AccountViewModel的DataTemplate。

<DataTemplate DataType="{x:Type AccountViewModel}">
    <StackPanel>
        <TextBox Text="{Binding Name}/>
        <Button Content="Save" Command="{Binding SaveAccount}"/>
    </StackPanel>
</DataTemplate>

这种设计大量使用数据绑定,这是MVVM的基础,并且运行得非常好。当然会出现一些问题,例如:如何使用模型处理集合?如何处理来自ui的视图模型中的事件?如何存储我的数据?

但是对于这些,您可以在此处和网络中找到许多资源。但是这个答案应该让你粗略地概述我和其他人如何使用WPF。

答案 3 :(得分:0)

是的你可以......但是没有必要这样做........... 替代方式是.........

制作网格中使用的数据数据集......然后将整个数据集导入网格。所以这里不需要添加项目.....现在你可以过滤,排序,添加,删除或任何你想要的东西......