【问题标题】:Binding to a property of an instance of a class, or modifying the properties from code绑定到类实例的属性,或从代码修改属性
【发布时间】:2011-03-08 01:13:53
【问题描述】:

我在使用 WPF 进行一些数据绑定时遇到了问题。我有一个类来保存各种数据。我希望它持有的数据绑定到不同窗口中的文本框。我发现的所有内容都推荐这个:

<Grid.Resources>
    <c:PropertyModel x:Key="propMod" />
</Grid.Resources>
<Grid.DataContext>
    <Binding Source="{StaticResource propMod}"/>
</Grid.DataContext>

这个问题是它在某处被实例化,我无法得到这个“propMod”。我想从代码中更改一些 propMod 的属性。

我尝试过的另一种方法是在代码隐藏中创建一个实例,例如

PropertyModel propMod = new PropertyModel();

但我无法让 WPF 绑定到这个,尽管文档声称 {Binding propMod.PropA} 应该可以工作。

谢谢

【问题讨论】:

    标签: c# wpf properties binding


    【解决方案1】:

    您想要的关键是将(您的窗口、网格等的)DataContext 设置为您的 PropertyModel 实例。

    通常,我会在 View 的代码隐藏中执行此操作,如下所示:

    var viewModel = new SomeAwesomeViewModel();
    DataContext = viewModel;
    

    可以在构造函数中,也可以在 Window 的 Loaded 事件的事件处理程序中。

    如果您希望能够从其他代码中操作 ViewModel 的某些属性,那么也许您应该在其他地方实例化 ViewModel(例如,在另一个知道需要进行哪些修改的 ViewModel 中),然后传递实例化的并将 ViewModel 修改为要使用的 View。我通过一个事件和一个包含 ViewModel 的自定义 EventArgs 参数完成了类似的操作。

    【讨论】:

    • 感谢 Eric,这似乎是最好的方法,因为让 XAML 实例化模型有点奇怪。
    【解决方案2】:

    您应该能够使用代码方法 - 但您需要将 Grid 的 DataContext 显式设置为新实例化的“propMod”变量。

    如果您想使用第一种方法,您可以从代码中访问资源。您需要找到网格,然后执行:

    Grid grid = MethodToGetTheGridInstance();
    PropertyModel propMod = (PropertyModel)grid.FindResource("propMod");
    

    有关从代码中获取资源的详细信息,see MSDN

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 2013-08-25
      • 2020-09-01
      • 2023-03-26
      • 1970-01-01
      • 2020-03-28
      • 2019-10-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多