0

ItemsControl同じビューモデルにバインドされた、2つのビューを持つ1つのビューを作成するにはどうすればよいのでしょうか。

これは私が持っているものです:

ViewModels:

  • MonitoredItemViewModel.cs
  • MonitoredItemsViewModel.cs(プロパティBindableCollection MonitoredItemsといくつかのコマンドが含まれています)

ビュー:

  • MonitoredItemView.xaml
  • MonitoredItemsView.xaml(2つの異なるコントロールを使用して、MonitoredItemViewModelのコレクションを表示します)

MonitoredItemsView.xamlで、-collection内のすべてのオブジェクトに関する詳細を表示するWpfToolkitとDataGrid、同じデータを異なる方法で表示する場所(MonitoredItemView.xamlによる)が必要です。MonitoredItemsItemsControl

設定することにより

<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を使用したことがないことを告白します。

ビューに2つItemsControlsあり、それらを1つのビューモデルオブジェクトの同じコレクションにバインドする場合は、標準のバインドメカニズムが機能します。同じプロパティにバインドできるコントロールの数に(実際の)制限はありません。

各コントロールでデータを異なる方法で表示する場合、受け入れられるアプローチは、のをオーバーライドしItemTemplateItemsControlDataTemplateデータを必要な方法でレイアウトすることです。これらはDataTemplate、再利用するために別のリソースディクショナリに配置できます。

于 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

ModelCaliburnMicroBindクラスの添付プロパティの機能は次のとおりです。

/// <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 に答える