【问题标题】:Set a property of a model/viewmodel from XAMLthat is not part of a UI item从 XAML 设置不属于 UI 项的模型/视图模型的属性
【发布时间】:2015-12-21 00:40:30
【问题描述】:

我在模型中有一个属性,我想在加载视图时设置一次。它是一个影响视图的属性,因此感觉应该在视图中设置它(而不是模型中的默认值)。我不希望最终用户设置该属性,这就是它未绑定到 UI 元素的原因。我希望视图设计器设置值。

视图模型(可以访问模型)设置为视图中用户控件的数据上下文。这似乎应该很简单,但我一直无法弄清楚。

谢谢

【问题讨论】:

    标签: wpf xaml properties


    【解决方案1】:

    当FrameworkElement 加载事件发生时,你的意思是要调用xaml 中定义的ChangePropertyAction 吗?

    <UserControl>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Loaded">
                <ei:ChangePropertyAction TargetObject="{Binding Model}" 
                                         PropertyName="IsLoaded"
                                         Value="True" />
             </i:EventTrigger>
        </i:Interaction.Triggers>
    
    </UserControl>
    

    编辑:在 UserControl 上有一个名为 IsLoaded 的属性,不幸的是它不是 DependencyProperty,您不能轻松地将数据绑定到 id。

    但是还有一个简单的方法:

    <UserControl Loaded="SetIsLoaded">
    
    void SetIsLoaded(object sender, EventArgs e){
        ((ViewModel)DataContext).Model.IsLoaded = true;
    }
    

    【讨论】:

    • 有趣。我会试试这个。这可能是我正在寻找的东西,但它比我想象的要复杂得多。我并不是因为我认为这很简单:-)
    • 这就是我想要的。谢谢!
    • 我更喜欢你的原版。也许我不应该?但我喜欢它,因为我目前没有任何代码,所以我从没想过去看那里。您发布的第一种方法使我可以看到它,因此我可以根据需要进行更改。
    • 您在 xaml 中看到,如果您选择好名称,代码隐藏中有一些东西,您知道那是什么。如果您不这样做,您仍然可以在 xaml 中发表评论。由您选择。没那么重要。
    【解决方案2】:

    我在模型中有一个属性。

    你的意思是模型还是视图模型?拥有这样的属性从视图传播到模型感觉就像一种难闻的气味,尽管也许我错了。也许你的一个例子会有所帮助。

    如果您需要在设计器中设置该属性,您总是可以在后面的代码中定义一个依赖属性。假设您将此 UI 部分封装在用户控件中。然后使用依赖属性的 OnChange 方法将该值传播到您需要的地方。您可能还需要考虑在设置 DataContext 之前设置依赖属性时的情况。为此,您必须确保在 DataContext 的 OnChange 方法中获取依赖项属性的值,并且如果设置了它,则将其传播到您需要的地方。

    【讨论】:

    • 在这种情况下,我要设置的值在模型中。我使用了属性一词,因为我使用的是 Simple MVVM Toolkit,并且该值使用 NotifyPropertyChanged 来通知 UI。如果我将它绑定到 UI 元素,比如说一个文本框,模型中的属性将由用户通过绑定更新。我想做同样的事情,但不是最终用户更新,我希望 UI 设计人员在被 UI 绘制之前设置它
    【解决方案3】:

    我在模型中有一个属性,我想在加载视图时设置一次。

    使用后面的 Window/Control Loaded 事件代码来更改包含提到的模型的 VM 上的值。你是不是想多了?

    【讨论】:

    • 我是不是想多了?大概。感觉就像我可以在视图本身中设置一个值(而不是背后的代码)。我想做的事情不是一个好主意吗?不可能吗?谢谢
    • @MaxPower MVVM 只是层的逻辑分离;人们对可以去哪里以及发生在我们所有人身上的事情感到困惑。只要有适当的关注点分离,有时就可以适应一次性的情况。坦率地说,我发现简单地将视图上的项目更改为视图模型对于大多数开发人员来说不会被视为失礼。所以我说从视图做。 :-)
    • 谢谢。我是一名嵌入式工程师,但当我编写必须与我的嵌入式系统交互的 PC 应用程序时,我喜欢了解可以/应该如何做的事情。我可以把它放在后面的代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多