我应该为WPF控件编写类吗

本文关键字:控件 WPF 我应该 | 更新日期: 2023-09-27 18:25:46

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

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

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

我应该为WPF控件编写类吗

我们在程序中使用MVVM方法。虽然各个程序的细节可能有所不同,但MVVM通常由三个主要部分构建。

型号:这就是你的数据对象。这可能是类似的业务数据

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的基础,并且工作得非常好。当然,可能会出现一些问题,比如:如何处理模型的Collection?如何处理来自ui的视图模型中的事件?如何存储我的数据?

但对于这些,你可以在这里和网上找到很多资源。但这个答案应该会让你大致了解我和其他很多人是如何使用WPF的。

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

如果FooHistory类的大多数功能都是业务逻辑(或表示以外的任何东西),那么将FooHistory控件与FooHistory类别分离是值得的,但在这种情况下,也许最好为控件定义一个接口,并使用该接口向FooHistory指令传递对控件的引用。这样,你的FooHistory类就不需要知道任何关于表示的东西——甚至不需要知道它是WPF。

如果你能避免传递控件树(如SomeWindow.ParentControl.ChildControl.Items),这会让你的生活更轻松。

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

缺少的东西被称为数据绑定和命令。除此之外,MVC的一个新变体-模型视图视图模型(MVVM),有时称为表示模型。大致解释如下:您的窗口称为视图。Youd-Busines逻辑封装在一个模型中。您可以创建一个ViewModel类,该类公开一些属性,这些属性是模型的视图特定表示形式。VM还应该实现CCD_ 12,以提供向UI通知数据更改的方式。您以相同的方式公开操作-通过类型为ICommand的属性。在View的构造函数中,您可以编写类似this.DataContext = new ViewModel()的内容然后使用{Binding PropName}语法绑定视图控件属性和ViewModel。

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

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

是的,你可以。。。。。。但没有必要这么做。。。。。。。。。。。另一种方法是……

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