Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 在使用控件本身时,如何使用伪数据设计时初始化XAML UserControl?_Visual Studio_Xaml_Windows 8_Winrt Xaml - Fatal编程技术网

Visual studio 在使用控件本身时,如何使用伪数据设计时初始化XAML UserControl?

Visual studio 在使用控件本身时,如何使用伪数据设计时初始化XAML UserControl?,visual-studio,xaml,windows-8,winrt-xaml,Visual Studio,Xaml,Windows 8,Winrt Xaml,我有一个基本的WinRT XAML UserControl,它有一个依赖项属性,如下所示。用户控件显然仅在设计时在另一个页面或用户控件中使用时构造。当我在设计器中使用用户控件本身时,不会呈现文本“Hello world”。在这种情况下,如何使设计器也使用数据初始化用户控件 XAML: IIRC,以您编写的直接形式,这是不可能实现的,因为在设计时,您不使用控件的实例。请注意XAML的第一行:根元素指定了一个UserControl,即基类。这就是您使用的实例!这就是为什么使用抽象基类设计组件时总是出

我有一个基本的WinRT XAML UserControl,它有一个依赖项属性,如下所示。用户控件显然仅在设计时在另一个页面或用户控件中使用时构造。当我在设计器中使用用户控件本身时,不会呈现文本“Hello world”。在这种情况下,如何使设计器也使用数据初始化用户控件

XAML:


IIRC,以您编写的直接形式,这是不可能实现的,因为在设计时,您不使用控件的实例。请注意XAML的第一行:根元素指定了一个UserControl,即基类。这就是您使用的实例!这就是为什么使用抽象基类设计组件时总是出现问题的原因。在设计器中使用的所有内容都是一个UserControl实例,由XAML指定的内容填充

XAML解析器实例化由标记名描述的任何对象。在设计控件时,会阻止解析器实例化它,因为控件实际上还不存在。这就是为什么XAML的第一个单词是UserControl,而您的类名是作为x:class属性给出的。当您保存XAML时,它将被预处理为指定了分部类的MyControl.g.cs文件,它将与您自己的MyControl.cs一起编译,只有这样Visual Studio(或您的应用程序)才能调用它包含的代码

如果您努力尝试,您可能会强制XAML解析器加载您的控件,但是为什么呢?您将拥有以前生成的快照,而不是当前编辑的快照。只有XAML模板保持最新,因为它们是动态删除和加载的

这就是“为什么我的构造函数没有运行”部分

如果需要在ctor中设置消息,为什么不将其设置为默认属性值

public sealed partial class SimpleBinding : UserControl
{
    public static DependencyProperty MessageProperty = DependencyProperty.Register(
           "Message", typeof(String), typeof(SimpleBinding), new PropertyMetadata("Hello world"));
...
    public SimpleBinding()
    {
        this.InitializeComponent();
    }
}
当然,与构造函数中的分支/计算/etc相比,它有很大的限制和硬编码。如果您需要更多的自由,请尝试使用设计时数据,这可能会有所帮助


如果<>强>真正的< /强>需要在自己的设计时间内在组件中运行自定义代码,请考虑将代码移到虚拟基类中,而不是在XAML的根上。XAML解析器将被迫实例化它,然后使用XAML的内容对其进行蒙皮。请注意,您将调用该基类的先前成功构建。另外,记住使用IsInDesignMode或类似的方法(参见ie)来过滤行为。

好的,一个更简单的方法是声明性调用

<UserControl>

    <d:Page.DataContext>
        <sample:FakeViewModel />
    </d:Page.DataContext>

    <Grid>
        <!-- your bind/content -->
    </Grid>

</UserControl>


我在我所有的项目中都使用它,因为它在不干扰我的运行时体验的情况下提供设计时数据。更多信息:

您的回答是正确的,但恐怕我问错了问题。如果将数据绑定属性移动到ViewModel,则确实可以获得仅在设计时可见的数据(尽管控件本身尚未构造)。我将在原始帖子的评论中描述这个方法。我发现了一个描述如何获取设计时数据的方法。通过将Message属性移动到一个单独的ViewModel类中并使用设计时DataContext,我可以实现我想要的。这基本上就是我最终使用的方法,从我的注释中链接到的SO问题到原始问题。我将把这个作为公认的答案。是的,这是一个很好的方法。很容易。并解决了当前Blend在2012年还不支持数据生成的问题。
public sealed partial class SimpleBinding : UserControl
{
    public static DependencyProperty MessageProperty = DependencyProperty.Register(
           "Message", typeof(String), typeof(SimpleBinding), new PropertyMetadata("Hello world"));
...
    public SimpleBinding()
    {
        this.InitializeComponent();
    }
}
<UserControl>

    <d:Page.DataContext>
        <sample:FakeViewModel />
    </d:Page.DataContext>

    <Grid>
        <!-- your bind/content -->
    </Grid>

</UserControl>