C# DataContext用户控件与父子控件
我有一个UserControl,它使用另一个UserControl作为控件之一,父UC有2-3个buton和textbox作为其他控件。现在,我在通过编码使用DataContext的子usercontrol中设置TreeView。它工作得很好,但是当我在父用户控件上添加DataContext时,现在子用户控件给出错误,即TreeViewItem的DataContext是父类型,因此无法解析为子DataContext类型 我们怎样才能解决这个问题。我认为,当我显式地在子对象上设置DataContext时,它不应该被父对象的数据上下文覆盖 我是MVVM新手,因此在理解概念方面没有什么问题。因此,请尽可能使用简单的语言: 编辑:我刚刚发现这个,但是,这对我来说不起作用,因为我的DataContext for TreeView实际上不是一个ViewModel,而是我编写它时使用的一个自定义类。我不想在开发的这个阶段重写完整的ViewModel,因为我的控件和项目的其余部分是非常隔离的 编辑2: 父控件的源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
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方法,它解决了问题[具有讽刺意味的是,我的代码运行良好]在这一小改动之后。