动态编辑内容
Dynamic editing Content
我有一个 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
绑定到每个页面的 ViewModel
中的 ObservableCollection
例如:
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 的建议,我设法(部分地)实现了我想要的,方法是在我的 ResourceDictionary
中创建 DataTemplate
并从代码隐藏中动态加载它们。
数据模板(示例)
<DataTemplate x:Key="MyUserControl1" DataType="{x:Type local:UserControl1}">
<local:UserControl1 />
</DataTemplate>
Page1 中的用法(示例)
<ContentControl x:Name="cC1Page1" Content="{Binding}" ContentTemplate="{StaticResource MyUserControl1}" />
从代码隐藏更改 ContentTemplate(示例)
this.cC2Page1.ContentTemplate = FindResource("MyUserControl1") as DataTemplate;
现在我必须查看 DataBinding
是否正常工作,并找到一种方法为页面中不适合的 UserControl
添加新页面。
在 WPF 中,我们倾向于操作 数据 而不是 UI 控件。我的意思是我们在 UserControl
中或通过 DataTemplate
显示我们的数据。因此,要将一些UI控件从一个地方复制到另一个地方,我们实际上只是将数据从一个地方复制到另一个地方,然后显示相同的UserControl
或渲染DataTemplate
在该位置具有相同的数据。
对于您的情况,我建议您定义一个包含您的 UserControl
的 DataTemplate
,然后将 DataTemplate
应用到您选择的任何页面中的 ContentControl
想把它显示进去。举这个简单的例子:
在Resources
中:
<DataTemplate x:Key="YourDataTemplate" DataType="{Local YourDataType}">
<!-- Define your UserControl here -->
</DataTemplate>
然后可以这样显示:
<ContentControl Content="{Binding YourDataObject}"
ContentTemplate="{StaticResource YourDataTemplate}" />
所以实际上,您只需复制最后一行,WPF 框架将完成复制相关视图的艰苦工作。
我有一个 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
绑定到每个页面的 ViewModel
ObservableCollection
例如:
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 的建议,我设法(部分地)实现了我想要的,方法是在我的 ResourceDictionary
中创建 DataTemplate
并从代码隐藏中动态加载它们。
数据模板(示例)
<DataTemplate x:Key="MyUserControl1" DataType="{x:Type local:UserControl1}">
<local:UserControl1 />
</DataTemplate>
Page1 中的用法(示例)
<ContentControl x:Name="cC1Page1" Content="{Binding}" ContentTemplate="{StaticResource MyUserControl1}" />
从代码隐藏更改 ContentTemplate(示例)
this.cC2Page1.ContentTemplate = FindResource("MyUserControl1") as DataTemplate;
现在我必须查看 DataBinding
是否正常工作,并找到一种方法为页面中不适合的 UserControl
添加新页面。
在 WPF 中,我们倾向于操作 数据 而不是 UI 控件。我的意思是我们在 UserControl
中或通过 DataTemplate
显示我们的数据。因此,要将一些UI控件从一个地方复制到另一个地方,我们实际上只是将数据从一个地方复制到另一个地方,然后显示相同的UserControl
或渲染DataTemplate
在该位置具有相同的数据。
对于您的情况,我建议您定义一个包含您的 UserControl
的 DataTemplate
,然后将 DataTemplate
应用到您选择的任何页面中的 ContentControl
想把它显示进去。举这个简单的例子:
在Resources
中:
<DataTemplate x:Key="YourDataTemplate" DataType="{Local YourDataType}">
<!-- Define your UserControl here -->
</DataTemplate>
然后可以这样显示:
<ContentControl Content="{Binding YourDataObject}"
ContentTemplate="{StaticResource YourDataTemplate}" />
所以实际上,您只需复制最后一行,WPF 框架将完成复制相关视图的艰苦工作。