Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该为WPF控件编写类吗?_C#_Wpf - Fatal编程技术网

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框架,如Prismmvvmlight


下面是一些示例:

我们在程序中使用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:这是一个很好的开始