将子视图中的元素绑定到父视图模型的属性

冷梦

就像标题说的那样,我想将子View中的元素绑定到父ViewModel的属性。

是否有Caliburn.Micro或默认的WPF XAML语法来做到这一点?我的意思是,这种确切的情况是:绑定到父ViewModel的属性。

还是我应该尝试以其他方式实现这一目标?是这样,最好/最简单的方法是什么?

这是一个非常基本的Caliburn.Micro应用程序示例:

MainWindowViewModel.cs

namespace BindingToParentVMProperty.MVVM
{
    public class MainWindowViewModel
    {
        public ChildViewModel Child { get; set; }
        public string ParentName { get; set; }

        public MainWindowViewModel()
        {
            Child = new ChildViewModel();
            ParentName = "Peter Griffin";
        }
    }
}

MainWindowView.xaml

<UserControl x:Class="BindingToParentVMProperty.MVVM.MainWindowView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d">
    <Grid Width="200" Height="200">
        <ContentControl Name="Child" />
    </Grid>
</UserControl>

ChildViewModel.cs

using Caliburn.Micro;

namespace BindingToParentVMProperty.MVVM
{
    public class ChildViewModel
    {
        public BindableCollection<GrandChildViewModel> GrandKids { get; set; }
        public string ChildName { get; set; }

        public ChildViewModel()
        {
            ChildName = "Stewie Griffin";
            GrandKids = new BindableCollection<GrandChildViewModel>
                {
                    new GrandChildViewModel {GrandChildName = "Stewie Griffin Jr."},
                    new GrandChildViewModel {GrandChildName = "Rupert Griffin Jr."}
                };
        }
    }
}

ChildView.xaml

<UserControl x:Class="BindingToParentVMProperty.MVVM.ChildView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <!-- need to bind to MainWindowViewModel.ParentName-->
        <TextBlock Text="{Binding Path=HowToBindTo_ParentName}"/>
        <ListView Name="GrandKids" />
    </StackPanel>
</UserControl>

GrandChildViewModel.cs

namespace BindingToParentVMProperty.MVVM
{
    public class GrandChildViewModel
    {
        public string GrandChildName { get; set; }
    }
}

GrandChildView.xaml

<UserControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             x:Class="BindingToParentVMProperty.MVVM.GrandChildView"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <TextBlock x:Name="GrandChildName" />
        <!-- need to bind to ChildViewModel.ChildName -->
        <TextBlock Text="{Binding Path=HowToBindTo_ChildName}"/>
    </StackPanel>
</UserControl>
克里斯

似乎最直接的建议是保留有关孩子的父母的一些记录ViewModel(例如,Parent财产)。由于您希望将自己ViewModels绑定到各自的对象上Views,因此我认为,如果您开始绑定到属性并包含超出绑定范围的信息,这将在概念上变得非常棘手ViewModel

此外,尽管对于您正在处理的特定项目可能并不在意,但是,如果您开始包含other的属性UserControls,则会隐式创建链接和依赖项,如果您希望重新执行此操作,可能会给您带来不便在非层次结构上下文中使用控件。

也就是说,您可以遍历UI树以从父控件中获取所需的DataContextViewModel),并使用属性使用建议的现有WPF语法将其绑定到所需属性。KollegosRelativeSourceAncestorType

在您的情况下,可能看起来像这样:

<UserControl x:Class="BindingToParentVMProperty.MVVM.ChildView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:YourProjectNamespaceContainingParentView"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<StackPanel>
    <!-- Set our DataContext bind to parent MainWindowViews DataContext (ViewModel) -->
    <TextBlock Text="{Binding Path=ParentName}"
        DataContext="{Binding RelativeSource={RelativeSource
                      FindAncestor, AncestorType={x:Type local:MainWindowView}},
                      Path=DataContext}"/>
    <ListView Name="GrandKids" />
</StackPanel>

RelativeSource文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将媒体元素绑定到视图模型

来自分类Dev

发送请求之前,将视图中的值绑定到模型

来自分类Dev

将ContextMenu命令绑定到父视图模型RelayCommand

来自分类Dev

将ContextMenu命令绑定到父视图模型RelayCommand

来自分类Dev

成功将事件绑定到ajax返回的视图中的元素

来自分类Dev

将视图模型绑定到敲除中属性的存在

来自分类Dev

在父视图中触发子视图模型方法:MarionetteJs

来自分类Dev

在父视图模型中公开子视图模型的属性

来自分类Dev

如何直接绑定到子视图模型?

来自分类Dev

UWP:绑定到视图模型属性

来自分类Dev

将一个模型从局部视图传递到父视图,然后将另一个模型绑定到同一父视图

来自分类Dev

Caliburn.Micro ItemsSource不是绑定到当前视图模型,而是绑定到父视图模型

来自分类Dev

如何将视图的BackgroundColor属性绑定到Xamarin Forms中的视图模型?

来自分类Dev

如何将Monotouch UI元素的'enabled'属性绑定到Mvvmcross中的视图模型布尔值

来自分类Dev

如何将多个模型中的数据绑定到单个视图中的列表

来自分类Dev

在Razor视图中将模型绑定到文本框

来自分类Dev

MVC绑定模型到视图中的下拉列表

来自分类Dev

XAML data.binding-如何将方法中的属性绑定到视图中的经度/纬度?

来自分类Dev

如何将字符串属性绑定到视图中的单选按钮?

来自分类Dev

XAML data.binding-如何将方法中的属性绑定到视图中的经度/纬度?

来自分类Dev

如何从子视图模型绑定到父视图模型中的事件

来自分类Dev

如何从子视图模型绑定到父视图模型中的事件

来自分类Dev

如何将动态加载的局部视图与父模型绑定

来自分类Dev

如何使用Promise将应用程序的视图模型绑定到自定义元素?

来自分类Dev

Universal Apps:如何将ListViewItem(容器)的属性绑定到实际项目(视图模型)?

来自分类Dev

从视图模型绑定到ListView项目的点击属性

来自分类Dev

通过notifychanged或command属性在父视图模型和子视图模型之间进行通信?

来自分类Dev

通过notifychanged或command属性在父视图模型和子视图模型之间进行通信?

来自分类Dev

如何使用子视图模型方法制作父视图绑定命令

Related 相关文章

  1. 1

    将媒体元素绑定到视图模型

  2. 2

    发送请求之前,将视图中的值绑定到模型

  3. 3

    将ContextMenu命令绑定到父视图模型RelayCommand

  4. 4

    将ContextMenu命令绑定到父视图模型RelayCommand

  5. 5

    成功将事件绑定到ajax返回的视图中的元素

  6. 6

    将视图模型绑定到敲除中属性的存在

  7. 7

    在父视图中触发子视图模型方法:MarionetteJs

  8. 8

    在父视图模型中公开子视图模型的属性

  9. 9

    如何直接绑定到子视图模型?

  10. 10

    UWP:绑定到视图模型属性

  11. 11

    将一个模型从局部视图传递到父视图,然后将另一个模型绑定到同一父视图

  12. 12

    Caliburn.Micro ItemsSource不是绑定到当前视图模型,而是绑定到父视图模型

  13. 13

    如何将视图的BackgroundColor属性绑定到Xamarin Forms中的视图模型?

  14. 14

    如何将Monotouch UI元素的'enabled'属性绑定到Mvvmcross中的视图模型布尔值

  15. 15

    如何将多个模型中的数据绑定到单个视图中的列表

  16. 16

    在Razor视图中将模型绑定到文本框

  17. 17

    MVC绑定模型到视图中的下拉列表

  18. 18

    XAML data.binding-如何将方法中的属性绑定到视图中的经度/纬度?

  19. 19

    如何将字符串属性绑定到视图中的单选按钮?

  20. 20

    XAML data.binding-如何将方法中的属性绑定到视图中的经度/纬度?

  21. 21

    如何从子视图模型绑定到父视图模型中的事件

  22. 22

    如何从子视图模型绑定到父视图模型中的事件

  23. 23

    如何将动态加载的局部视图与父模型绑定

  24. 24

    如何使用Promise将应用程序的视图模型绑定到自定义元素?

  25. 25

    Universal Apps:如何将ListViewItem(容器)的属性绑定到实际项目(视图模型)?

  26. 26

    从视图模型绑定到ListView项目的点击属性

  27. 27

    通过notifychanged或command属性在父视图模型和子视图模型之间进行通信?

  28. 28

    通过notifychanged或command属性在父视图模型和子视图模型之间进行通信?

  29. 29

    如何使用子视图模型方法制作父视图绑定命令

热门标签

归档