Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
Wpf DataTemplate类型的依赖项属性的UserControl默认值_Wpf_User Controls_Dependency Properties_Default Value - Fatal编程技术网

Wpf DataTemplate类型的依赖项属性的UserControl默认值

Wpf DataTemplate类型的依赖项属性的UserControl默认值,wpf,user-controls,dependency-properties,default-value,Wpf,User Controls,Dependency Properties,Default Value,我有一个简单的EntriesViewModel,它存储项目列表,并支持添加/删除命令。添加/删除遗漏的命令 public class EntriesViewModel { public ObservableCollection<string> Entries { get; private set; } public EntriesViewModel() { Entries = new ObservableCollection<strin

我有一个简单的EntriesViewModel,它存储项目列表,并支持添加/删除命令。添加/删除遗漏的命令

public class EntriesViewModel
{
    public ObservableCollection<string> Entries { get; private set; }

    public EntriesViewModel()
    {
        Entries = new ObservableCollection<string>() { "One", "Two", "Three" };
    }
}
 public partial class EntriesEditor : UserControl
{
    public EntriesEditor()
    {
        InitializeComponent();
    }
}

<UserControl x:Class="UserControlDefaults.EntriesEditor"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:l="clr-namespace:UserControlDefaults"
         VerticalAlignment="Top">
<DockPanel Height="200">
    <UniformGrid Columns="2"
                 DockPanel.Dock="Bottom">
        <Button Content="Add" />
        <Button Content="Remove" />
    </UniformGrid>
    <ListBox ItemsSource="{Binding Entries}"
             ItemTemplate="{Binding EntryTemplate, RelativeSource={RelativeSource AncestorType={x:Type l:EntriesEditor}}}"/>
</DockPanel>
为了查看这一点,我创建了一个简单的EntriesEditor用户控件,它使用一个列表框来显示添加/删除添加/删除命令的条目和按钮

public class EntriesViewModel
{
    public ObservableCollection<string> Entries { get; private set; }

    public EntriesViewModel()
    {
        Entries = new ObservableCollection<string>() { "One", "Two", "Three" };
    }
}
 public partial class EntriesEditor : UserControl
{
    public EntriesEditor()
    {
        InitializeComponent();
    }
}

<UserControl x:Class="UserControlDefaults.EntriesEditor"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:l="clr-namespace:UserControlDefaults"
         VerticalAlignment="Top">
<DockPanel Height="200">
    <UniformGrid Columns="2"
                 DockPanel.Dock="Bottom">
        <Button Content="Add" />
        <Button Content="Remove" />
    </UniformGrid>
    <ListBox ItemsSource="{Binding Entries}"
             ItemTemplate="{Binding EntryTemplate, RelativeSource={RelativeSource AncestorType={x:Type l:EntriesEditor}}}"/>
</DockPanel>
其用途如下:

<l:EntriesEditor DataContext="{Binding EntriesViewModel}"/>
现在我希望EntriesEditor支持定义自定义ItemTemplate的功能。因此,我添加了EntryTemplate属性

public partial class EntriesEditor : UserControl
{
    public DataTemplate EntryTemplate
    {
        get { return (DataTemplate)GetValue(EntryTemplateProperty); }
        set { SetValue(EntryTemplateProperty, value); }
    }

    public static readonly DependencyProperty EntryTemplateProperty =
        DependencyProperty.Register("EntryTemplate", typeof(DataTemplate), typeof(EntriesEditor), new PropertyMetadata(null));

    public EntriesEditor()
    {
        InitializeComponent();
    }
}

<UserControl x:Class="UserControlDefaults.EntriesEditor"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:l="clr-namespace:UserControlDefaults"
         VerticalAlignment="Top">
<DockPanel Height="200">
    <UniformGrid Columns="2"
                 DockPanel.Dock="Bottom">
        <Button Content="Add" />
        <Button Content="Remove" />
    </UniformGrid>
    <ListBox ItemsSource="{Binding Entries}"
             ItemTemplate="{Binding EntryTemplate, RelativeSource={RelativeSource AncestorType={x:Type l:EntriesEditor}}}"/>
</DockPanel>
其用途如下:

<l:EntriesEditor DataContext="{Binding EntriesViewModel}">
    <l:EntriesEditor.EntryTemplate>
        <DataTemplate>
            <Border BorderThickness="1"
                    BorderBrush="Green"
                    Padding="5">
                <ContentPresenter Content="{Binding}"/>
            </Border>
        </DataTemplate>
    </l:EntriesEditor.EntryTemplate>
</l:EntriesEditor>
但是现在我想在EntriesEditor控件中定义一个默认的EntryTemplate,我该怎么做呢

我能想到的唯一办法是:

<UserControl x:Class="UserControlDefaults.EntriesEditor"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:l="clr-namespace:UserControlDefaults"
         VerticalAlignment="Top">

<UserControl.Style>
    <Style TargetType="{x:Type l:EntriesEditor}">
        <Setter Property="EntryTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border BorderThickness="2"
                            BorderBrush="Red">
                        <ContentPresenter Content="{Binding}" />
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Style>

<DockPanel Height="200">
    <UniformGrid Columns="2"
                 DockPanel.Dock="Bottom">
        <Button Content="Add" />
        <Button Content="Remove" />
    </UniformGrid>
    <ListBox ItemsSource="{Binding Entries}"
             ItemTemplate="{Binding EntryTemplate, RelativeSource={RelativeSource AncestorType={x:Type l:EntriesEditor}}}"/>
</DockPanel>

但这似乎不正确。

@pastillman-为什么看起来不正确?这感觉像是一个解决办法,但如果这是正确的方法。。。那好吧DataTemplateSelector就是为此而设计的。