我应该为WPF控件编写类吗
本文关键字:控件 WPF 我应该 | 更新日期: 2023-09-27 18:25:46
我有一个网格,我称之为FooHistory
。现在我需要大量与此相关的功能,所以我继续创建一个FooHistory
类。现在我有了一个FooHistory
类和一个控件。
在我的MainWindow
构造函数中,我创建了这个类的一个新实例,并将this
的实例(即MainWindow
)传递给FooHistory
类,有点像依赖注入。稍后,当FooHistory
类想要与FooHistory
控件交互时,我会执行类似this.mainWindow.FooHistory.Items.Add(...)
的操作。
我的问题是,这是编写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的一些框架,如Prism、MVVM Light。
以下是一些示例:http://rachel53461.wordpress.com/2011/05/08/simplemvvmexample/
是的,你可以。。。。。。但没有必要这么做。。。。。。。。。。。另一种方法是……
制作网格中使用的数据集。。。。。。然后将整个数据集导入到网格中。所以这里不需要添加项目。。。。。现在你可以过滤、排序、添加、删除或任何你想要的。。。。