将ContentControl绑定到ViewModel并在与View关联的视图中保留该VM。

时间:2014-04-09 05:18:24

标签: c# wpf xaml windows-phone-8 mvvm

我正在创建一个WP8应用程序,我将contentcontrol绑定到ViewModel。此ContentControl获取App.xaml.cs中为该VM指定的DataTemplate并绑定到contentcontrol模板。但问题是我无法在我的视图中获取该VM的实例。如何获取或将我的VM实例传递给已绑定到内容控件的View。这是代码?

问题是当DyncmicContentControl获取ViewModel时,它调用GetTemplate()方法从App.xaml.cs获取相应的DataTemplate。这会创建该View的新实例,但我无法将此ViewModel传递给该View。我怎么能实现这个?

ContentControl.cs

public class DynamicContentControl : ContentControl
    {
        /// <summary>
        /// Called when the value of the <see cref="P:System.Windows.Controls.ContentControl.Content" /> property changes.
        /// </summary>
        /// <param name="oldContent">The old value of the <see cref="P:System.Windows.Controls.ContentControl.Content" /> property.</param>
        /// <param name="newContent">The new value of the <see cref="P:System.Windows.Controls.ContentControl.Content" /> property.</param>
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            if (newContent != null)
            {
                base.OnContentChanged(oldContent, newContent);
                this.ContentTemplate = DataTemplateSelector.GetTemplate(newContent);
            }
        }
    }

DataTemplateSelector.cs

    /// <summary>
    /// Gets the template.
    /// </summary>
    /// <param name="param">The parameter.</param>
    /// <returns></returns>
    public static DataTemplate GetTemplate(object param)
    {
        Type t = param.GetType();

        DataTemplate templateData = App.Current.Resources[t.Name] as DataTemplate;

        return templateData;
    }

MainPage.xaml中

    <Controls:DynamicContentControl Content="{Binding UsrCntrlDynamic}" />

MainPageViewModel.cs

 public static ObservableCollection<object> ContentControlItems;
 public MainPageViewModel()
 {
     ContentControlItems = new ObservableCollection<object>();
     ContentControlItems.Add(new UserControlViewModel());
 }

的App.xaml

 <DataTemplate x:Key="UserControlViewModel">
       <vm:UserControlView />
 </DataTemplate>

1 个答案:

答案 0 :(得分:0)

DataTemplate ContentControl属性上设置的ContentTemplate应用于ContentControl的{​​{1}}媒体资源上设置的对象。因此,在这种情况下设置Content应该使用您绑定的ContentTemplate属性中的任何内容呈现DataTemplate。这假定您UsrCntrlDynamic的{​​{1}}设置正确,包括ControlTemplate来接收和呈现ContentControl,这可能与您的自定义ContentPresenter无关。 1}}。