【问题标题】:WPF databinding in child control子控件中的 WPF 数据绑定
【发布时间】:2012-04-04 11:16:18
【问题描述】:

我是 WPF 新手。我正在尝试构建一个具有功能(称为初始化)的应用程序,用户必须在其中填写大量数据并且重复表单的某些部分。尽管我们可能会在一个窗口中使用可折叠面板而不是下一页/上一页,但我们正在重写一个具有相当长向导的旧版应用程序。还有一些部分是重复的,例如用户可以指定多个项目,如果他们说 3,他们将需要为每个项目填写一些配置信息,因此这些控件需要重复 3 次。

我正在使用 MVVM 并在此处使用此示例:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

旧向导大约有 4 页,所以我打算拥有一个包含 4 个子用户控件的用户控件(初始化)来稍微分解 xaml。

到目前为止,我已经完成了初始化(它的 ViewModel 继承自 Workspace ViewModel,如上例所示)并且它包含一个正在工作的子节点:

<Expander ExpandDirection="Down" Header="ChildOne">
<view:ChildOne />
</Expander>

我将为每个孩子和初始化有单独的 ViewModel,这给我带来了我的问题。 我遇到的问题是 ChildOne 包含一个我试图绑定的下拉列表:

<ComboBox x:Name="textMessageTypeCmb" ItemsSource="{Binding Path=TextMessageSelectionOptions, Mode=OneTime}"/>

TextMessageSelectionOptions 是 ChildOne 的 ViewModel 中的公共属性。这不会导致任何错误,但会出现一个空的下拉列表 - 永远不会调用该属性 getter。如果我将该属性 getter 代码移到 Initialisation 的 ViewModel 中,它会起作用,但我试图将我的代码保持在可管理的块中,所以我想将帽子代码放回 ChildOne 的 ViewModel 中。如果在我的 MainWindow 中我将 ChildOne 创建为工作区而不是像这样进行初始化,它也可以工作

ChildOneViewModel ws = this.Workspaces.FirstOrDefault(vm => vm is ChildOneViewModel) as ChildOneViewModel;

谁能建议我是否采用了正确的方法(通过将其划分为多个用户控件)以及我需要在绑定中执行哪些操作才能使其工作?我真的不明白这些,但特别有约束力。

【问题讨论】:

    标签: wpf data-binding user-controls


    【解决方案1】:

    在我看来,您 ChildOne 视图的 DataContext 仍然是这个 Initialisation vm。

    您可以将视图 Datacontext 绑定到 ChildOneViewModel 对象

    ...
    <view:ChildOne DataContext={Binding PropertyReturnsChildOneViewModellObject/>
    ...
    

    或指定组合框 ItemsSource 属性的路径。

    <ComboBox x:Name="textMessageTypeCmb" ItemsSource="{Binding Path=PropertyReturnsChildOneViewModellObject.TextMessageSelectionOptions, Mode=OneTime}"/>
    

    注意:PropertyReturnsChildOneViewModellObject 是初始化虚拟机的一个属性。

    【讨论】:

    • 两者都有效,我选择了前者,因为会有几个控件需要绑定到子视图模型的属性。谢谢 - 我还没有足够的声望来投票。
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多