这是对这个问题的扩展尝试。在我的 WPF 程序中,我一直在tabItems
使用一个XamlWriter
名为TrycloneElement
. 我最初是在这里找到这个功能的,但是这个功能也可以在我上一个问题的链接中查看。
现在我开始担心程序内部的功能,我发现该TrycloneElement
函数不会复制分配给tabItem
它正在克隆的任何代码隐藏功能。
由于 High Core 的链接和对我之前的问题的评论,我决定开始tabItems
通过我的 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;
}
}
*注意:我知道我在上面的代码中作弊并直接与我的视图交互,但我不确定如何运行这些命令。如果这是一个问题,或者有其他方法,请告诉我如何在不与视图交互的情况下运行这些相同的命令。
现在的问题:
更改我的代码并将命令添加到我的 ViewModel 后,该TrycloneElement
功能不再起作用。在选项卡克隆期间运行时,我收到一条XamlParseException
在线消息,object x = XamlReader.Load(xmlReader);
内容如下:
如果有更好的方法并且我不再需要它,我可以放弃该功能。但最终,我如何获取 atabItem
的设计和功能并克隆它?(请记住,我真的在尝试纠正我的结构)
谢谢您的帮助。
修改 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);
}
}