WPF/C# 中带有绑定的外部用户控件

External UserControl with Bindings in WPF/C#

所以,我有一个 UserControl,它基本上是一个具有 3 个不同 DataGrid 和一些标签的网格。看到我需要使用它 3 次,而不是复制和粘贴代码,我想我只生成一次并在我的主要 window.

中使用它

我将 UserControl 定义为:

<UserControl x:Class="Propuestas.UI.Andrei.DGMTX"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:Propuestas.UI.Andrei"
             mc:Ignorable="d"
             Height="300" 
             Width="791.496">

我在我的 window 中这样使用它:

<StackPanel Grid.Row="2">
    <local:DGMTX/>
    <local:DGMTX/>
    <local:DGMTX/>
</StackPanel>

出于某种原因,它没有出现在我的主 window 的设计器面板中。我做错了什么吗?

此外,我希望能够基于绑定元素进行绑定。例如,假设我有一个 class 模型,其中包含我需要在我的 UserControl 中表示的所有数据。 我想做类似

的事情
<local:DGMTX Binding = {Binding Model}/>

然后能够在其代码中绑定我的 UserControl 中的所有其他元素。有什么办法可以在 XAML 中做到这一点吗?还是我必须以编程方式进行?

有两种方法可以将您的视图模型传递给控件:

  1. 正如一位评论者所建议的那样,将您的视图模型绑定到用户控件的数据上下文。这可以将视图模型中的所有内容绑定到控件的内部工作。问题是内部工作现在取决于对象关联的数据。

  2. 仅为视图模型中用户控件实际需要的那些创建依赖属性。在几乎 99% 的所有情况下,我个人更喜欢这个而不是第一个,因为您确切地知道控件需要什么数据,并且您可以以控件独有的方式操作绑定数据,而视图模型可能不负责。

在创建您自己的控件时,有关设计器支持的一些注意事项:

  1. Visual Studio的设计者在WPF方面还是有很多问题。不相信我?尝试在另一个程序集中引用在您的主程序集中定义的动态资源。设计器会崩溃并告诉你找不到。然而,实际情况并非如此。一旦您 运行 应用程序,您将永远不会看到此异常。
  2. 为了在设计器中看到对源所做的更改,您必须首先构建项目(控件所在的项目,不一定是引用它的项目)。有时,"cleaning" 或(在某些情况下运气更好)"rebuilding" 当 "building" 不起作用时,该项目是唯一更新主项目中的设计器的东西。
  3. 如果考虑了后者还是看不到任何东西,再考虑控件的实现。有什么地方不对劲吗?是不是不小心把东西藏起来了?一开始你可能不这么认为,也许需要十个小时的挫败感才能屈服并检查,但小事可以改变一切。