C# 将数据从视图绑定到ItemsPanelTemplate

C# 将数据从视图绑定到ItemsPanelTemplate,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,我一直在开发我的第一个MVVM WPF应用程序,我想在其中绘制一个包含节点和边的图。目前,我正在视图的代码隐藏中完成所有绘图逻辑,迭代节点,相应地创建形状并将它们添加到画布中 因为我不想跟踪形状,只想根据给定的数据(即节点)绘制它们,所以我决定创建节点和边的可观察集合,并将项控件绑定到它们,以便自动绘制形状 现在,我将重点放在绘制节点上,并提出了以下XAML代码: 在我看来,当用户在画布上滚动时,我设置了两个属性ScaleX和ScaleY。在我以前的代码隐藏版本中,我将使用这些属性创建一个S

我一直在开发我的第一个MVVM WPF应用程序,我想在其中绘制一个包含节点和边的图。目前,我正在视图的代码隐藏中完成所有绘图逻辑,迭代节点,相应地创建形状并将它们添加到画布中

因为我不想跟踪形状,只想根据给定的数据(即节点)绘制它们,所以我决定创建
节点和
边的
可观察集合
,并将
项控件
绑定到它们,以便自动绘制形状

现在,我将重点放在绘制节点上,并提出了以下XAML代码:


在我看来,当用户在画布上滚动时,我设置了两个属性
ScaleX
ScaleY
。在我以前的代码隐藏版本中,我将使用这些属性创建一个
ScaleTransform
,并使用
LayoutTransform
将其应用于命名画布

public分部类视图:第页
{
公共双ScaleX{get;set;}
公共双尺度{get;set;}
这个版本的问题是,我无法在新的仅XAML代码中使用它。我希望将
ItemsPanelTemplate
ScaleX
ScaleY
ScaleTransform
属性绑定到我视图中的属性。只有正常的
ElementName
绑定不起作用工作是有原因的。更清楚地说,画布可能不知道视图,我假设是因为它是一个模板。此外,我不能从后面的代码调用画布,即使它有一个名称

我尝试了几种解决方案,摸索了
RelativeResources
等,但我想我不清楚为什么
ItemsPanelTemplate
与XAML代码中的所有其他内容都如此断开连接。请提前感谢

更新


也许我应该澄清一下,通过将
ScaleX
ScaleY
属性移动到ViewModel并绑定到这些属性,可以很容易地解决这个问题。但我认为这些视图特定的属性不应该驻留在ViewModel中。

我不确定您是否设置了视图的DataContext,这将有助于显示更多的代码隐藏

internal ViewModel viewModel { get; set; }

public View()
{
      DataContext = (viewModel = new ViewModel());
}
您是否将ObservableCollection绑定到节点的ItemSource?我不熟悉绘图,但当我绑定到子节点时,我从未获得过结果


<>但是我开发了大约4个利用MVVM的项目。

< P>当你说视图特定信息不应该在视图模型中时,你是正确的。但是在你的情况下,这些位置成为模型的一部分,因为这些位置只不过是基于你的视图应该表现的数据。在这种情况下,你可以将它们视为模型大鼠的一部分。编写一个单独的模型类,并在ViewModel类的可观察集合中使用它。我希望它能消除您的疑虑

public class Node
{
    public double ScaleX { get; set; }
    public double ScaleY { get; set; }
}
编辑
回答你的问题


但是比例属性指定了画布的行为方式,那么视图是否还没有作为“模型”使用呢?对于我来说,创建一个新模型只是为了设置单个画布的比例属性似乎是多余的。视图应该只关注图形数据,因为属性用作这些图形的修改,所以t嘿,他们属于风景区,不是吗

您希望根据提供的数据绘制图形。Node类将为您提供数据。它存储数据而不是画布应如何呈现的逻辑,XAML代码使用此数据并具有在视图中显示数据的逻辑

那么该视图是否还没有成为这方面的“模型”?

您尝试的实现在视图中包含模型,其目的是将模型与视图分离。最初创建一个仅包含两个双值的类可能看起来多余。但是如果您将它们从视图中抽象出来,则会有一些好处

  • 在视图模型中,可以为此节点类(模型)创建一个可观察集合。如果视图中有ScaleX和ScaleY,则无法从Viewmodel访问它
  • 将来,您可能希望将ScaleX和ScaleY更改为不同的比例,例如Logarmic比例/不同的单位。在这种情况下,您必须更改ViewModel中的逻辑才能做到这一点,并且不必担心更改视图。但是,如果视图中有此可观察集合,则必须更改视图以进行更改ge向数据/模型发送电子邮件
  • 最后,您可以为ViewModel中的任何内容编写单元测试,但不能为视图编写单元测试

通常,ScaleX和ScaleY将是视图的一部分,但在您的情况下,它们会更改和存储数据。因此,您需要将此ScaleX和ScaleY抽象到不同的层中,以保留MVVM概念。

如我的问题中所述,我可以使用
ItemSource
成功绘制节点。
Path=nodes
ObservableCollection节点
属性在我的
GraphHoverView
ViewModel中。但是我需要其值的
ScaleX
ScaleY
属性出现在视图本身的代码后面,而不是在ViewModel中。希望这会让事情变得更清楚一些。但是Scale属性指定画布应该如何ld behave,那么该视图是否还没有用作此操作的“模型”?对于我来说,创建新模型只是为了设置单个画布的缩放属性似乎是多余的?该视图应该只关注绘图数据,并且因为这些属性用作这些dr的修改