我有一个网格,我称之为FooHistory
。现在我需要大量与此相关的功能,所以我继续创建一个FooHistory
类。现在我有一个FooHistory
类和一个控件。
在我的MainWindow
构造函数中,我创建了这个类的新实例,并将this
的实例(即MainWindow
)传递给FooHistory
类,就像依赖注射。然后,当FooHistory
类想要与FooHistory
控件进行交互时,我会执行this.mainWindow.FooHistory.Items.Add(...)
之类的操作。
我的问题是,这是编写WPF应用程序的推荐方法还是我缺少一些基本方法?
答案 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)
是的你可以......但是没有必要这样做........... 替代方式是.........
制作网格中使用的数据数据集......然后将整个数据集导入网格。所以这里不需要添加项目.....现在你可以过滤,排序,添加,删除或任何你想要的东西......