我有一个用户控件,它使用另一个用户控件作为控件之一,父 UC 有 2-3 个按钮和文本框作为其他控件。现在我通过我的编码在使用 DataContext 的子用户控件中设置 TreeView。它工作正常,但是当我在父 userControl 上添加 DataContext 时,现在子用户控件给出了 TreeViewItem 的 DataContext 是“父类型”的错误,因此无法解析为子 DataContext 类型。
我们该如何解决这个问题。我相信当我在子节点上显式设置 DataContext 时,它不应该被父节点的数据上下文覆盖。
我是 MVVM 的新手,因此在掌握概念方面几乎没有问题。所以请尽可能使用简单的语言:)。
编辑:我刚刚找到了这个WPF 数据上下文父/子用户控件但是,这对我不起作用,因为 TreeView 的 DataContext 并不是真正的 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;
}
...
}
共享 Child 的 DataContext 有点棘手,因为在我的 usercontrol 代码后面,我使用 Treeview Expand 功能,然后从服务器获取 Json 字符串并从中创建一个 List 并通过 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;
}
不确定这是否有帮助。谢谢