【问题标题】:A view with two controls, bound to the same data具有两个控件的视图,绑定到相同的数据
【发布时间】:2012-12-18 22:30:20
【问题描述】:

我想知道如何让 1 个视图和两个 ItemsControl 绑定到同一个视图模型。

这就是我所拥有的:

视图模型:

  • MonitoredItemViewModel.cs
  • MonitoredItemsViewModel.cs(包含属性 BindableCollection MonitoredItems 和一些命令)

观看次数:

  • MonitoredItemView.xaml
  • MonitoredItemsView.xaml(显示 MonitoredItemViewModel 的集合,使用两个不同的控件)

在我的 MonitoredItemsView.xaml 中,我希望有一个 WpfToolkit DataGrid 来显示有关 MonitoredItems 集合中每个对象的详细信息,以及一个 ItemsControl,我想在其中显示相同的数据,但以不同的方式(根据 MonitoredItemView.xaml)

通过设置

<wtk:DataGrid x:Name="MonitoredItems" Height="Auto" AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0" Width="Auto" VerticalAlignment="Stretch">
...
</wtk:DataGrid>

Caliburn.Micro 根据名称为数据网格解决了这个问题。

如何让我的 ItemsControl 绑定到相同的数据? 绑定通过设置来工作

<ItemsControl ItemsSource="{Binding MonitoredItems, Mode=TwoWay}">
...
</ItemsControl>

但是我没有得到根据 MonitoredItemView.xaml 模板每个项目的 Caliburn.Micro-magic

【问题讨论】:

  • 很抱歉,我在回答您的问题时遇到了一些问题。您列出了两个视图模型,但您希望视图绑定到相同的数据?您是指单个视图模型中的相同数据吗?为什么您的示例中有两个视图模型?
  • 我会尽量澄清我原来的问题

标签: .net wpf mvvm caliburn.micro


【解决方案1】:

您可以只使用Bind.Model 附加属性

例如

<ItemsControl ItemsSource="{Binding MonitoredItems, Mode=TwoWay}" cal:Bind.Model="{Binding PathToVMToBindTo}">
    ....
</ItemsControl>

然后CM 将使用ViewModelBinder 应用它的约定

如果有疑问,请阅读 CodePlex 网站上的 CM 文档(与许多其他项目相比,它们非常简洁)并检查那里的源代码:

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions&referringTitle=Documentation

这就是 Caliburn Micro Bind 类上的 Model 附加属性的作用:

/// <summary>
///   Hosts dependency properties for binding.
/// </summary>
public static class Bind
{
    /// <summary>
    ///   Allows binding on an existing view. Use this on root UserControls, Pages and Windows; not in a DataTemplate.
    /// </summary>
    public static DependencyProperty ModelProperty =
        DependencyProperty.RegisterAttached(
            "Model",
            typeof(object),
            typeof(Bind),
            new PropertyMetadata(null, ModelChanged)
            );

    static void ModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (Execute.InDesignMode || e.NewValue == null || e.NewValue == e.OldValue)
        {
            return;
        }

        var fe = d as FrameworkElement;
        if (fe == null)
        {
            return;
        }

        View.ExecuteOnLoad(fe, delegate
        {
            var target = e.NewValue;
            var containerKey = e.NewValue as string;

            if (containerKey != null)
            {
                target = IoC.GetInstance(null, containerKey);
            }

            d.SetValue(View.IsScopeRootProperty, true);

            var context = string.IsNullOrEmpty(fe.Name)
                              ? fe.GetHashCode().ToString()
                              : fe.Name;

            ViewModelBinder.Bind(target, d, context);
        });
    }

【讨论】:

    【解决方案2】:

    好的,会尝试在这里回答,但我承认我以前没有使用过 Caliburn.Micro。

    如果您在视图上有两个ItemsControls,并且您希望它们绑定到单个视图模型对象中的同一个集合,那么标准绑定机制将起作用。可以将多少个控件绑定到同一个属性没有(真正的)限制。

    如果您希望每个控件以不同的方式显示数据,则可接受的方法是用 DataTemplate 覆盖 ItemsControlItemTemplate,以便按照您的需要布置数据。这些DataTemplates 可以放在单独的资源字典中以供重复使用。

    【讨论】:

    • 谢谢。我想我现在会用标准的 WPF 方式来做。
    • 有效,但您可以使用 CM 的 Bind.Model 附加属性获得所有 CM 魔法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多