0

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

这就是我所拥有的:

视图模型:

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

意见:

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

在我的 MonitoredItemsView.xaml 中,我希望有一个 WpfToolkitDataGrid来显示有关 -collection 中每个对象的详细信息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

4

2 回答 2

1

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

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

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

于 2013-01-04T13:54:16.773 回答
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 类的Model附加属性的Bind作用:

/// <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);
        });
    }
于 2013-01-04T18:52:39.087 回答