首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MVVM结构复制TabItem

使用MVVM结构复制TabItem
EN

Stack Overflow用户
提问于 2013-09-04 20:11:32
回答 2查看 286关注 0票数 0

这是一次在this question上扩展的尝试。在我的WPF程序中,我通过在一个名为tabItems的函数中使用XamlWriter来克隆TrycloneElement。我最初找到了这个函数here,但是这个函数也可以在我前面问题的链接中查看。

现在我开始担心程序中的功能,我发现TrycloneElement函数没有复制分配给正在克隆的tabItem的任何代码隐藏功能。

由于High的链接和对我前面问题的评论,我决定开始通过ViewModel数据绑定在我的ViewModel上实现功能。

下面是我实现的一个命令的示例:

代码语言:javascript
复制
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函数就不再工作了。在选项卡克隆期间运行时,我收到一个在线XamlParseExceptionobject x = XamlReader.Load(xmlReader);,它读取:

如果有更好的方法,我可以放弃这个函数,而且我不再需要它了。但最终,我如何看待tabItem的设计和功能,并克隆它呢?(请记住,我真的在试图纠正我的结构)。

谢谢你的帮助。

修正Leo的答案

这是Leo答案的当前版本,我已经编译了。(有一些语法错误)

代码语言:javascript
复制
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);
       }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-04 21:42:00

Here是我在WPF中正确实现的动态TabControl的示例。

主要思想是每个Tab项都是一个单独的小部件,它包含自己的逻辑和数据,由ViewModel处理,而UI执行UI必须做的事情:show数据,而不是contain数据。

底线是,所有的数据和功能都是在ViewModel /模型级别上管理的,而且由于TabControl绑定到了ObservableCollection,所以只要您需要添加新的Tab,就只需向该集合添加另一个元素。

这就消除了“克隆”UI或使用它执行任何其他奇怪操作的需要。

票数 1
EN

Stack Overflow用户

发布于 2013-09-04 20:31:17

1.)要修复该XamlParseException,请确保您有一个像空构造函数一样的公共构造函数,您可能定义了一个构造函数,当您试图序列化该对象并反序列化它时,不能。您必须显式地添加默认构造函数。

2.)我不喜欢克隆这个词,但我会说,当他们想复制的时候。我将手动创建一个新的选项卡项控件,然后对其进行反射。

我有一个我做的代码

代码语言:javascript
复制
  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);
        }
    }

所以就像

代码语言:javascript
复制
var newTabItem = new TabItem();
newTabItem.CopyPropertiesFrom(masterTab);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18622916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档