这是一次在this question上扩展的尝试。在我的WPF程序中,我通过在一个名为tabItems的函数中使用XamlWriter来克隆TrycloneElement。我最初找到了这个函数here,但是这个函数也可以在我前面问题的链接中查看。
现在我开始担心程序中的功能,我发现TrycloneElement函数没有复制分配给正在克隆的tabItem的任何代码隐藏功能。
由于High的链接和对我前面问题的评论,我决定开始通过ViewModel数据绑定在我的ViewModel上实现功能。
下面是我实现的一个命令的示例:
public viewModel()
{
allowReversing = new Command(allowReversing_Operations);
}
public Command AllowReversing
{
get { return allowReversing; }
}
private Command allowReversing;
private void allowReversing_Operations()
{
//Query for Window1
var mainWindow = Application.Current.Windows
.Cast<Window1>()
.FirstOrDefault(window => window is Window1) as Window1;
if (mainWindow.checkBox1.IsChecked == true) //Checked
{
mainWindow.checkBox9.IsEnabled = true;
mainWindow.groupBox7.IsEnabled = true;
}
else //UnChecked
{
mainWindow.checkBox9.IsEnabled = false;
mainWindow.checkBox9.IsChecked = false;
mainWindow.groupBox7.IsEnabled = false;
}
} *注意:我知道我在上面的代码中欺骗并直接与View交互,但我不知道如何运行这些命令。如果这是一个问题,或者有其他方法,请告诉我如何运行这些相同的命令,而不像我做的那样与视图交互。
现在来问问题:
在更改代码并将命令添加到我的ViewModel之后,TrycloneElement函数就不再工作了。在选项卡克隆期间运行时,我收到一个在线XamlParseException,object x = XamlReader.Load(xmlReader);,它读取:

如果有更好的方法,我可以放弃这个函数,而且我不再需要它了。但最终,我如何看待tabItem的设计和功能,并克隆它呢?(请记住,我真的在试图纠正我的结构)。
谢谢你的帮助。
修正Leo的答案
这是Leo答案的当前版本,我已经编译了。(有一些语法错误)
public static IList<DependencyProperty> GetAllProperties(DependencyObject obj)
{
return (from PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.SetValues) })
select DependencyPropertyDescriptor.FromProperty(pd)
into dpd
where dpd != null
select dpd.DependencyProperty).ToList();
}
public static void CopyPropertiesFrom(this FrameworkElement controlToSet,
FrameworkElement controlToCopy)
{
foreach (var dependencyValue in GetAllProperties(controlToCopy)
.Where((item) => !item.ReadOnly)
.ToDictionary(dependencyProperty => dependencyProperty, controlToCopy.GetValue))
{
controlToSet.SetValue(dependencyValue.Key, dependencyValue.Value);
}
}发布于 2013-09-04 21:42:00
Here是我在WPF中正确实现的动态TabControl的示例。
主要思想是每个Tab项都是一个单独的小部件,它包含自己的逻辑和数据,由ViewModel处理,而UI执行UI必须做的事情:show数据,而不是contain数据。
底线是,所有的数据和功能都是在ViewModel /模型级别上管理的,而且由于TabControl绑定到了ObservableCollection,所以只要您需要添加新的Tab,就只需向该集合添加另一个元素。
这就消除了“克隆”UI或使用它执行任何其他奇怪操作的需要。
发布于 2013-09-04 20:31:17
1.)要修复该XamlParseException,请确保您有一个像空构造函数一样的公共构造函数,您可能定义了一个构造函数,当您试图序列化该对象并反序列化它时,不能。您必须显式地添加默认构造函数。
2.)我不喜欢克隆这个词,但我会说,当他们想复制的时候。我将手动创建一个新的选项卡项控件,然后对其进行反射。
我有一个我做的代码
public static IList<DependencyProperty> GetAllProperties(DependencyObject obj)
{
return (from PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] {new PropertyFilterAttribute(PropertyFilterOptions.SetValues)})
select DependencyPropertyDescriptor.FromProperty(pd)
into dpd where dpd != null select dpd.DependencyProperty).ToList();
}
public static void CopyPropertiesFrom(this FrameworkElement controlToSet,
FrameworkElement controlToCopy)
{
foreach (var dependencyValue in GetAllProperties(controlToCopy)
.Where((item) => !item.ReadOnly))
.ToDictionary(dependencyProperty => dependencyProperty, controlToCopy.GetValue))
{
controlToSet.SetValue(dependencyValue.Key, dependencyValue.Value);
}
}所以就像
var newTabItem = new TabItem();
newTabItem.CopyPropertiesFrom(masterTab);https://stackoverflow.com/questions/18622916
复制相似问题