我希望我的UserControl
(RepositoryContainer
)在XAML Designer上填充数据。
我创建了一个名为RepositoryContainerDesignData.xaml
的文件(它与RepositoryContainer.xaml
位于同一文件夹中),并将其设置为d:DataContext
的{{1}}。
但是,XAML Designer不显示数据,而是显示属性名称。
这是一个最小的例子:
UserControl
<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>
IsDesignTimeCreatable
as true
: using System.Windows.Controls;
namespace SystemSpecs.View.UserControls
{
public partial class RepositoryContainer : UserControl
{
public string Title { get; set; }
public RepositoryContainer()
{
InitializeComponent();
}
}
}
文件夹.vs
RepositoryContainerDesignData.xaml
是Build Action
我错过了什么吗?
如果我创建了一个类(例如DesignData
),则创建一个名为public class RepositoryContainerData
的属性,并将此类的实例设置为Title
(d:DataContext
),它按预期工作
答案 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>
文件属性设置为:
控件定义是
<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>
设计师的结果是
不是我经常做的事情,但我已经学会了一些东西:)