动态编辑内容

时间:2015-05-21 07:46:04

标签: c# wpf mvvm user-controls observablecollection

我有一个MVVM应用程序使用3个用户控件作为多个页面中的内容(页面也是用户控件)和一些额外的静态内容。

例如:

的Page1.xaml

<StackPanel x:Name="pnlMain" Orientation="Vertical">
    <TextBlock FontWeight="Bold" Text="Title 1" />
    <local:UserControl1 />
    <TextBlock FontWeight="Bold" Text="Title 2" />
    <local:UserControl2 />
    <local:UserControl2 />
</StackPanel> 

Page2.xaml

<StackPanel x:Name="pnlMain" Orientation="Vertical">
    <TextBlock FontWeight="Bold" Text="Title 3" />
    <local:UserControl2 />
    <TextBlock FontWeight="Bold" Text="Title 4" />
    <local:UserControl3 />
</StackPanel>

每个用户控件的ViewModel都绑定到每个页面内的ObservableCollection ViewModel

例如:

Page1ViewModel.cs

    [DataMember(EmitDefaultValue = false)]
    public ObservableCollection<UserControl1ViewModel> Ucon1
    {
        get { return this.ucon1; }
        set { this.ucon1= value; Changed("Ucon1"); }
    }

    [DataMember(EmitDefaultValue = false)]
    public ObservableCollection<UserControl2ViewMode> Ucon2
    {
        get { return this.ucon2; }
        set { this.ucon2= value; Changed("Ucon2"); }
    }

我想要完成的是能够移动(复制到page2并从page1中删除)页面之间的用户控件。我正在考虑使用ListView,但每个页面在用户控件之间也包含静态内容这一事实是一个缺点。

有人可以提出办法吗?

感谢。

解决方案(部分):

使用@ Sheridan的提议,我设法通过在DataTemplate中创建ResourceDictionary并从代码隐藏中动态加载它来实现(部分)我想要的。

DataTemplate(示例)

<DataTemplate x:Key="MyUserControl1" DataType="{x:Type local:UserControl1}">
    <local:UserControl1 />
</DataTemplate>

第1页中的用法(示例)

<ContentControl x:Name="cC1Page1" Content="{Binding}" ContentTemplate="{StaticResource MyUserControl1}" />

从Codebehind更改ContentTemplate(示例)

this.cC2Page1.ContentTemplate = FindResource("MyUserControl1") as DataTemplate;

现在,我必须查看DataBinding是否正常工作,并找到一种方法为UserControl添加新页面,而该页面不适合页面。

1 个答案:

答案 0 :(得分:1)

在WPF中,我们倾向于操纵数据而不是 UI控件。我的意思是我们在UserControlDataTemplate中显示数据。因此,要从一个地方复制一些UI控件,我们实际上只是将数据从一个地方复制到另一个地方,并显示相同的UserControl或渲染DataTemplate该位置的数据相同。

对于您的情况,我建议您定义包含DataTemplate的{​​{1}},然后只需将UserControl应用于您想要的任何页面中的DataTemplate显示它。举个简单的例子:

ContentControl

Resources

然后你可以这样显示:

<DataTemplate x:Key="YourDataTemplate" DataType="{Local YourDataType}">
    <!-- Define your UserControl here -->
</DataTemplate>

所以事实上,你需要复制的只是最后一行,而WPF框架将完成重复相关视图的艰苦工作。