绑定时,XAML Designer显示属性名称而不是Designer数据(d:DataContext)

时间:2017-02-07 17:18:34

标签: c# wpf visual-studio xaml

上下文

我希望我的UserControlRepositoryContainer)在XAML Designer上填充数据。

我创建了一个名为RepositoryContainerDesignData.xaml的文件(它与RepositoryContainer.xaml位于同一文件夹中),并将其设置为d:DataContext的{​​{1}}。

但是,XAML Designer不显示数据,而是显示属性名称。

这是一个最小的例子:

设计数据(RepositoryContainerDesignData.xaml)

UserControl

用户控件(RepositoryContainer.xaml)

<local:RepositoryContainer xmlns:local="clr-namespace:SystemSpecs.View.UserControls"
                           Title="My Repository Title"
/>

代码隐藏

<UserControl x:Class="SystemSpecs.View.UserControls.RepositoryContainer"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                xmlns:local="clr-namespace:SystemSpecs.View.UserControls"
                mc:Ignorable="d" 
                d:DesignHeight="100" d:DesignWidth="500"
                d:DataContext="{d:DesignData Source=RepositoryContainerDesignData.xaml}"
                DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <Grid>
        <TextBlock Text="{Binding Path=Title}" FontSize="24" Foreground="White" HorizontalAlignment="Center" />
    </Grid>
</UserControl>

预期产出:

Expected output

输出:

Output

已经尝试过:

  • Set IsDesignTimeCreatable as true:
  • 关闭Visual Studio并删除using System.Windows.Controls; namespace SystemSpecs.View.UserControls { public partial class RepositoryContainer : UserControl { public string Title { get; set; } public RepositoryContainer() { InitializeComponent(); } } } 文件夹
  • .vs RepositoryContainerDesignData.xamlBuild Action

环境信息:

  • Windows 10 Pro x64
  • Visual Studio Community 2015(版本14.9.25431.01 Update 3)
  • Microsoft .NET Framework 4.6.01586
  • Pastebin RAW的更多信息以保持帖子清洁

我错过了什么吗?

PS

如果我创建了一个类(例如DesignData),则创建一个名为public class RepositoryContainerData的属性,并将此类的实例设置为Titled:DataContext),它按预期工作

2 个答案:

答案 0 :(得分:3)

您应该在WPF用户控件中使用依赖项属性,因为它们具有更改通知。

    public static DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(RepositoryContainer), new FrameworkPropertyMetadata(new PropertyChangedCallback(Title_Changed)));

    public string Title
    {
        get { return (string)GetValue(TitleProperty); }
        set { SetValue(TitleProperty, value); }
    }


    private static void Title_Changed(DependencyObject o, DependencyPropertyChangedEventArgs args)
    {
        RepositoryContainer thisClass = (RepositoryContainer)o;
        thisClass.SetTitle();
    }

    private void SetTitle()
    {
        //Put Instance Title Property Changed code here
    }

只需使用上面的代码替换标题属性,就不必添加任何内容即可使其正常工作。 SetTitle()只需要代码,如果您需要对代码中更改的标题作出反应。

我有一个很久以前创建的c#代码片段,可以很容易地创建依赖项属性,如果你需要,请告诉我。

答案 1 :(得分:3)

您尝试做的事情对我有用,可能会有一些细微的变化。我创建了一个名为WpfApplication2的新应用。

RepositoryContainerDesignData.xaml包含:

<wpfApplication2:RepositoryContainer 
    xmlns:wpfApplication2="clr-namespace:WpfApplication2"
    Title="My repository title">
</wpfApplication2:RepositoryContainer>

文件属性设置为:

enter image description here

控件定义是

<UserControl x:Class="WpfApplication2.RepositoryContainer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             d:DataContext="{d:DesignData Source=RepositoryContainerDesignData.xaml}"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="Bisque">
        <TextBlock Text="{Binding Path=Title}" FontSize="24" 
                   HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UserControl>

设计师的结果是

enter image description here

不是我经常做的事情,但我已经学会了一些东西:)