【问题标题】:How to bind to a property in view but not in viewmodel?如何绑定到视图中的属性但不在视图模型中?
【发布时间】:2015-08-11 06:40:20
【问题描述】:

我有一些控件,它们的值在视图中使用,但与在视图模型中无关。我想将控件绑定到视图中的属性,而不必将它们复制到视图模型。

根据a similar question's reply,这是可能的,我正在使用以下代码来实现这一点。但是,当我没有看到预期的结果时,我猜测我无意中绑定到了旗杆,而不是预期的属性。

XAML

<DatePicker x:Name="Uno"
            SelectedDate="{Binding StartDate, Source={x:Static Application.Current}}"
            SelectedDateChanged="DatePicker_OnSelectedDateChanged" />
<DatePicker x:Name="Due"
            SelectedDate="{Binding StartDate, Source={x:Static Application.Current}}"
            SelectedDateChanged="DatePicker_OnSelectedDateChanged" />

C#

public partial class ViewWindow : Window
{
  public static DateTime StartDate { get; set; }
  ...
}

我的代码中缺少什么?还是我误解了回复并采取了错误的方式?

【问题讨论】:

  • 你是否遵循 MVVM 模式?
  • @un-lucky 抱歉在我之前的评论中讽刺。让我们再试一次。我觉得你的问题在这里毫无意义,因为标题清楚地表明我想绑定到视图模型以外的东西。因此,我是否使用它超出了问题的范围。请查看下面的回复,了解如何实现所请求的绑定。 (除非您的评论背后有更深层次的想法,在这种情况下,我会全神贯注。)

标签: c# wpf xaml data-binding


【解决方案1】:

这个:

x:Static Application.Current

尝试将Application.Current 设置为特定绑定表达式的绑定源。但是,很明显,你不想访问像 Application.Current.StartDate 这样的东西(我想你的 App 类没有定义这样的属性)。

实际上,我在您的属性定义中错过了 static 关键字。
如果您使用的是 .NET 4.5 或更高版本,则可以通过这种方式为静态属性编写绑定路径:

<DatePicker x:Name="Uno"
            SelectedDate="{Binding Path=(local:ViewWindow.StartDate)}"
            SelectedDateChanged="DatePicker_OnSelectedDateChanged" />

local 这里是一个命名空间,其中定义了ViewWindow
否则,使用RelativeSource 标记扩展(这也适合这种情况,当属性是实例时):

<DatePicker x:Name="Uno"
            SelectedDate="{Binding StartDate, 
              RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType={x:Type Window}}}"
            SelectedDateChanged="DatePicker_OnSelectedDateChanged" />

【讨论】:

  • 哈扎!这对你来说是一张绿色支票。如果您还想通过 SourceApplication.Current 等说明我一直在做的事情(也许这没有错,但不适用于我的需要)等。 ,还有一个很酷的 +1 在我老鼠的左键顶部等待。
  • @KonradViltersten 您使用Application(不是Window)作为绑定源。如果您绑定的属性在Window 中而不是Application 中(根据Application.Current 定义),您希望它如何找到它?
  • @KonradViltersten 请注意在您链接的答案中,他们确实在Application 中定义了该属性,您在窗口/视图中有它
  • @Jcl 解释是有道理的,现在已经说明了。我假设我的窗口 应用程序(它肯定是 一个 应用程序,对吗?),因为它是我程序中的“启动方式”。但这是假设而不是推理,所以我很高兴我们已经清楚地解决了这个问题。可能还有其他人也做出这种假设。
  • 一个窗口远不是一个应用程序(如果你想这样称呼它,在语义上和“技术上”)。有许多没有窗口的应用程序,也有许多具有多个窗口的应用程序(而且,如果我们在这里了解技术,有许多“程序化的 Application 类在多个 AppDomains 上运行的“概念应用程序”)。在 WPF 中有MainWindow 的概念,您可以在Application.Current.MainWindow 中找到它,但这是运行时信息,我不会将其用于绑定到自身的视图中。RelativeSource(或local)是正确的工具
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 2013-03-22
  • 2022-01-17
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多