C# 我应该为WPF控件编写类吗?
我有一个我称之为C# 我应该为WPF控件编写类吗?,c#,wpf,C#,Wpf,我有一个我称之为fooshistory的网格。现在我需要大量与此相关的功能,因此我继续创建一个FooHistory类。现在我有了一个FooHistory类和一个控件 在我的MainWindow构造函数中,我创建了这个类的一个新实例,并将this的实例(即MainWindow)传递给FooHistory类,类似于依赖注入。然后,当FooHistory类想要与FooHistory控件交互时,我会执行类似this.mainWindow.FooHistory.Items.Add(…)的操作 我的问题是,
fooshistory
的网格。现在我需要大量与此相关的功能,因此我继续创建一个FooHistory
类。现在我有了一个FooHistory
类和一个控件
在我的MainWindow
构造函数中,我创建了这个类的一个新实例,并将this
的实例(即MainWindow
)传递给FooHistory
类,类似于依赖注入。然后,当FooHistory
类想要与FooHistory
控件交互时,我会执行类似this.mainWindow.FooHistory.Items.Add(…)
的操作
我的问题是,这是编写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 Business逻辑封装在模型中。 您可以创建一个ViewModel类,该类公开一些属性,这些属性是模型的视图特定表示形式。VM还应该实现
INotifyPropertyChanged
,以提供一种向UI通知数据更改的方法。通过类型为ICommand
的属性以相同的方式公开操作。
在视图的构造函数中,您可以编写类似于this.DataContext=newviewmodel()
然后使用{Binding PropName}
语法绑定视图控件属性和视图模型
您可能还想查看一些MVVM框架,如Prism,mvvmlight
下面是一些示例:我们在程序中使用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 ); }
}
查看:
这可以是用户控件、自定义控件、窗口、数据模板等。
尽管有一种普遍的看法,但是在视图中隐藏代码是很好的,否则,您就必须屈服于背景词,因为您听说视图不允许包含代码
现在常用的方法是创建一个模型、一个或多个viewmodels,并在视图中将这些viewmodels设置为DataContext
。有时,您需要一个DataTemplate来显示给定的数据,比如AccountViewModel的DataTemplate
<DataTemplate DataType="{x:Type AccountViewModel}">
<StackPanel>
<TextBox Text="{Binding Name}/>
<Button Content="Save" Command="{Binding SaveAccount}"/>
</StackPanel>
</DataTemplate>
有趣的是,你能给我指个地方看一篇教程/文章吗?它展示了一个用MVVM制作的小示例应用程序。我添加了一些似乎对我很好的示例,但我从未尝试过用这种方式学习,所以我不能保证。我将从框架文档开始。总是有一个“入门”页面或类似页面。@rFactor:这是一个很好的开始