English 中文(简体)
用户控制是否有自己的观点模式?
原标题:Should a user control have its own view model?

我有一个由几个用户控制构成的窗口,并想知道每个用户控制是否有自己的观点模式,或者整个窗口是否只有一个看法模式?

最佳回答

这不是一个问题。 它取决于是否具有额外的观察模式能使你更好地保持可维持性或可检测性。 没有任何观点认为,如果这种模式不给你带来任何好处的话。 贵方需要评估间接费用是否值得您具体使用。

问题回答

绝对,积极

NO

您的用户组合应当NOT,有专为用户设计的观点。 事实上,这是一部法典。 这不会立即打破你的申请,但会给你带来痛苦。

用户框架只是利用构成建立控制的一种容易的方式。 用户群仍属控制区,因此只应涉及国际不动产业协会。

当你为用户创建观点时,你要么把业务或统一逻辑放在这里。 采用观点模型来控制概念逻辑是不正确的,因此,如果这是你的目标,就把证书放在控制线上。 如果你将业务逻辑重新列入用户目录,那么你很可能利用这一逻辑将部分申请分门别类,而不是简化控制设置。 管制应当简单明了,并具有设计的单一目的。

当你为用户创建观点时,你也通过数据目录打破了数据的自然流动。 这就是你将经历的最痛苦之处。 举出这个简单的例子。

我们有一个包含人的观点,每个都属于个人类型。

public class ViewModel
{
    public IEnumerable<Person> People { get; private set; }
    public ViewModel()
    {
        People = PeopleService.StaticDependenciesSuckToo.GetPeople();
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

在我们的窗口中显示一个人名单是微不足道的。

<Window x:Class="YoureDoingItWrong.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:YoureDoingItWrong"
        Title="Derp">
    <Window.DataContext>
        <l:ViewModel />
    </Window.DataContext>
    <Window.Resources>
        <DataTemplate DataType="{x:Type l:Person}">
            <l:PersonView />
        </DataTemplate>
    </Window.Resources>
    <ListView ItemsSource="{Binding People}" />
</Window>

该清单自动摘录了正确的个人项目模板,并利用个人意见向用户展示个人信息。

个人的意见是什么? 这是一个用户目录,旨在显示当事人的信息。 它对一个人的控制,类似于文本Block对文本的控制。 它旨在约束个人,因此工作顺利。 上文窗口的注解是,《名单》如何将每个人转至个人意见中,而个人意见成为这个视觉子群的数据背景。

<UserControl x:Class="YoureDoingItWrong.PersonView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <Label>Name</Label>
        <TextBlock Text="{Binding Name}" />
        <Label>Age</Label>
        <TextBlock Text="{Binding Age}" />
    </StackPanel>
</UserControl>

为了顺利开展工作,用户意见书必须作为“<>>设计的类型实例。 当你通过做 st时,就如 st st st地 st住。

public PersonView()
{
    InitializeComponent();
    this.DataContext = this; // omfg
}

public PersonView()
{
    InitializeComponent();
    this.DataContext = new PersonViewViewModel();
}

you ve broken the simplicity of the model. Usually in these instances you end up with abh或rent w或karounds, the most common of which is creating a pseudo-DataContext property f或 what your DataContext should actually be. And now you can t bind one to the other, so you end up with awful hacks like

public partial class PersonView : UserControl
{        
    public PersonView()
    {
        InitializeComponent();
        var vm = PersonViewViewModel();
        // JUST KILL ME NOW, GET IT OVER WITH 
        vm.PropertyChanged = (o, e) =>
        {
            if(e.Name == "Age" && MyRealDataContext != null)
                MyRealDataContext.Age = vm.PersonAge;
        };
        this.DataContext = vm; 
    }
    public static readonly DependencyProperty MyRealDataContextProperty =
        DependencyProperty.Register(
            "MyRealDataContext",
            typeof(Person),
            typeof(PersonView),
            new UIPropertyMetadata());
    public Person MyRealDataContext
    {
        get { return (Person)GetValue(MyRealDataContextProperty); }
        set { SetValue(MyRealDataContextProperty, value); }
    }
}

You should think of a UserControl as nothing m或e than a m或e complex control. Does the TextBox have its own ViewModel? No. You bind your VM s property to the Text property of the control, and the control shows your text in its UI.

MVVM doesn t stand f或 "No Codebehind". Put your UI logic f或 your user control in the codebehind. If it is so complex that you need business logic inside the user control, that suggests it is too encompassing. Simplify!

Think of UserControls in MVVM like this--F或 each model, you have a UserControl, and it is designed to present the data in that model to the user. You can use it anywhere you want to show the user that model. Does it need a button? Expose an ICommand property on your UserControl and let your business logic bind to it. Does your business logic need to know something going on inside? Add a routed event.

N或mally, in WPF, if you find yourself asking why it hurts to do something, it s because you shouldn t do it.

[应当]每个用户控制都有自己的观点,或者整个窗口是否只有一个观点?

不幸的是,对这一问题的最高答案是误导,根据我在其他问题上交换的意见,为试图学习世界森林基金会的人提供了指导差。 答复:

您的用户组合应当NOT,有专为用户设计的观点。

问题在于,不是问到的

我同意以下一般看法,即当你写上时,控制公众的标语不应也包含一种专门用于这种控制的观点模式。 客户守则必须能够使用它想要的那种模式。

但是,这并不排除以下想法:每个用户控制[目标]有自己的观点”(<>)。 至少可以设想两种明显的假设情景,我认为,答案是“每个用户控制的一种观点模式”:

  1. 用户控制是所列项目数据模板的一部分(例如<代码>ItemsControl)。 在这种情形下,观点模型将符合每个数据要素,在观点模型标与显示该观点模型标的用户控制之间将有一个一对一的通信。 “每个用户控制可能都有自己的观点模式”。

  2. The user control s implementation benefits from, or even requires, a view model data structure specifically designed for the user control. This view model data structure would not be exposed to the client code; it s an implementation detail, and as such would be hidden from the client code using the user control. But, that certainly still would be a view model data structure "designed specifically for" that user control.

    This scenario is clearly not problematic at all, which directly contradicts the claim that "您的用户组合应当NOT,有专为用户设计的观点。"

现在,我不认为,这一回答的作者无意排除这两种设想。 但是,问题在于,那些试图学习世界森林基金的人可能没有足够的背景来承认这一差异,因此,根据这一令人振奋、高度激动和误导性的答复,可能会对用户控制和视模型进行错误的概括。

我希望,通过提出这一替代观点,作为澄清点,以比较狭隘的方式回答原始问题,那些在了解更多有关世界森林基金时发现这一问题的人,会有更好的背景,有更好的想法,以及当一种观点模式可能针对用户控制而具体实施时。

我要说的是,每个用户控制都应当有自己的观点,因为这将使你能够在今后新的星座中重新使用观点Model/UserControl pair。

我的理解是,你的窗户是用户控制的一种复合物,因此,你总是能够形成一种观点,为每个用户控制构成所有单独的视角模型。 这将给你带来两个世界的最佳选择。

页: 1

铭记所有这些模式都旨在分割你的法典,使之今后更加可行。 包括MVVM。 这一观点具有某些责任,同样也具有观点,也如此。 新的开发商可以到场,能够承认这种模式,在寻找和维持事情方面有更好的想法。 最好不要忘记它。

因此,如果你有正确与用户控制有关的逻辑,那么为什么没有呢?

但这里有一个洞穴。 铭记用户目录。 这是一种小刀刺,可以从地方重新使用。 你的 v应当相同——可以重新使用。 你们最后想要结束的是,一种情况是,另一种情况是不同的。

注:没有技术。 我只谈模式的逻辑结构。

我猜测你的申请正在采取某种观点构成,这样,如果你使用户控制自己的观点模式,那么你就会有更多的自由将其融入其他东道窗口,而不改变全球窗口模式。

作为附加奖金,如果申请要求,你的申请将更适合发展成为一种更具有建筑价值的构成模式,如普里什蒂纳或卡利伯恩框架所规定的那样。





相关问题
WPF convert 2d mouse click into 3d space

I have several geometry meshes in my Viewport3D, these have bounds of (w:1800, h:500, d:25). When a user clicks in the middle of the mesh, I want the Point3D of (900, 500, 25)... How can I achieve ...

Editing a xaml icons or images

Is it possible to edit a xaml icons or images in the expression design or using other tools? Is it possible to import a xaml images (that e.g you have exported) in the expression designer for editing?...

WPF: writing smoke tests using ViewModels

I am considering to write smoke tests for our WPF application. The question that I am faced is: should we use UI automation( or some other technology that creates a UI script), or is it good enough to ...

WPF - MVVM - NHibernate Validation

Im facing a bit of an issue when trying to validate a decimal property on domain object which is bound to a textbox on the view through the viewmodel. I am using NHibernate to decorate my property on ...

How do WPF Markup Extensions raise compile errors?

Certain markup extensions raise compile errors. For example StaticExtension (x:Static) raises a compile error if the referenced class cannot be found. Anyone know the mechanism for this? Is it baked ...

WPF design-time context menu

I am trying to create a custom wpf control, I m wondering how I can add some design-time features. I ve googled and can t seem to get to my goal. So here s my simple question, how can I add an entry ...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...