C# DataContext用户控件与父子控件

C# DataContext用户控件与父子控件,c#,wpf,user-controls,C#,Wpf,User Controls,我有一个UserControl,它使用另一个UserControl作为控件之一,父UC有2-3个buton和textbox作为其他控件。现在,我在通过编码使用DataContext的子usercontrol中设置TreeView。它工作得很好,但是当我在父用户控件上添加DataContext时,现在子用户控件给出错误,即TreeViewItem的DataContext是父类型,因此无法解析为子DataContext类型 我们怎样才能解决这个问题。我认为,当我显式地在子对象上设置DataConte

我有一个UserControl,它使用另一个UserControl作为控件之一,父UC有2-3个buton和textbox作为其他控件。现在,我在通过编码使用DataContext的子usercontrol中设置TreeView。它工作得很好,但是当我在父用户控件上添加DataContext时,现在子用户控件给出错误,即TreeViewItem的DataContext是父类型,因此无法解析为子DataContext类型

我们怎样才能解决这个问题。我认为,当我显式地在子对象上设置DataContext时,它不应该被父对象的数据上下文覆盖

我是MVVM新手,因此在理解概念方面没有什么问题。因此,请尽可能使用简单的语言:

编辑:我刚刚发现这个,但是,这对我来说不起作用,因为我的DataContext for TreeView实际上不是一个ViewModel,而是我编写它时使用的一个自定义类。我不想在开发的这个阶段重写完整的ViewModel,因为我的控件和项目的其余部分是非常隔离的

编辑2:

父控件的源

public partial class ucProjectScreen : UserControl, ITabbedWindow
{
  ProjectScreenViewModel p = new ProjectScreenViewModel();

  public long ProjectID { get; set; }
  public ucProjectScreen()
  {
    InitializeComponent();
    this.TabName = "NoProject";
    this.TabTitle = "Project #";
    this.IsAllowRefresh = false;
    this.DataContext = p;
  }

  ...
}
DataContext for Child的共享有点棘手,因为在我的usercontrol代码中,我使用Treeview扩展功能,然后从服务器获取Json字符串,并从中列出并传递Itemsource属性

var Data = VSCommon.FetchFromWeb(URL);
List<InfoStructure> s = new List<InfoStructure>();
s = JSON.Deserialise<List<InfoStructure>>(Data);

if (s.Count > 0)
{
  List<TVDataStructure> ds = new List<TVDataStructure>();

  foreach (InfoStructure d in s)
  {
    TVDataStructure t1 = new TVDataStructure()
    {
      Header = d.Name,
      Tag = d,
      DoEvent = ((d.Type == "Directory" || d.Type == "Partition") ? true : false)
    };

    if (d.Type == "Directory" || d.Type == "Partition")
      t1.IconImage = IconReader.ToImageSource(IconReader.GetFolderIcon(IconReader.IconSize.Small, IconReader.FolderType.Closed));
    else
      t1.IconImage = IconReader.ToImageSource(IconReader.GetFileIcon(d.Name, IconReader.IconSize.Small, false));

    ds.Add(t1);
  }

  if (tds != null)
    tds.Children = ds;

  t.ItemsSource = ds;
}
不确定这是否有帮助。
谢谢

请您发布一些代码,而不是全部代码!只是显示如何设置父对象的DataContext和子对象的DataContext的部分。XAML+CSF默认情况下,WPF控件后面的DataContext数据层是从父控件继承的,听起来好像父控件的DataContext被子控件继承了。您可能可以为您的子控件使用RelativeSource绑定来查找正确的DataContext,但是如果没有看到您的代码和数据层结构,我就不能肯定。如果您对WPF的DataContext不熟悉,您可能会对阅读我的一篇博文感兴趣:编辑代码,感谢链接让我阅读:。谢谢Rachel,您的小博文提供了关于该主题的深刻见解。我意识到我做错了一点,实际上我正试图将TreeViewItem DataContext转换为我的DataStructure对象,[我的源代码Itesmsource在赋值时]它工作正常,当时我们没有父DataContext,但现在我从显式转换[给出错误]改为as方法,它解决了问题[具有讽刺意味的是,我的代码运行良好]在这一小改动之后。