0

我有以下 XAML:

<ListView Name="_listView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Name="_itemTemplate">
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我想要的是在我的后台代码中创建一个属性,它将采用自定义用户控件并将其作为动态模板。像这样的东西:

public UserControl ItemTemplate
{
    set { _itemTemplate.Content = value; }
}

那么我可以将我的控件放在窗口的 XAML 中并像这样声明项目模板:

<local:MyCustomControl ItemTemplate="local:ControlThatActsAsItemTemplate"/>

如何实现这样的目标?

4

2 回答 2

1

到目前为止,我找到了以下简单的解决方案。

在自定义控件 XAML 中定义 ListBox:

<ListBox Name="_listBox"/>

在后面的代码中创建一个属性:

public DataTemplate ItemTemplate
{
    get { return _listBox.ItemTemplate; }
    set { _listBox.ItemTemplate = value; }
}

在 XAML 中的父窗口或控件集资源中:

<Window.Resources>
    <DataTemplate x:Key="CustomTemplate">
        <TextBlock Text="{Binding Path=SomeProperty}"/>
    </DataTemplate>
</Window.Resources>

然后声明自定义控件:

<local:CustomControl ItemTemplate="{StaticResource CustomTemplate}"/>

现在您需要有一个接口来公开 SomeProperty 和包含您需要设置为 _listBox.ItemsSource 的此类接口实例的数据源。但这是另一个故事。

于 2013-07-29T09:56:00.117 回答
1

使用依赖属性的解决方案。

在自定义UserControl声明依赖属性中,将项目模板注入到_listBox

public static readonly DependencyProperty ItemTemplateProperty =
    DependencyProperty.Register("ItemTemplate",
                                typeof(DataTemplate),
                                typeof(AutoCompleteSearchBox),
                                new PropertyMetadata(ItemTemplate_Changed));

public DataTemplate ItemTemplate
{
    get { return (DataTemplate)GetValue(ItemTemplateProperty); }
    set { SetValue(ItemTemplateProperty, value); }
}

private static void ItemTemplate_Changed(
    DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    var uc = (MyUserControl)d;
    uc._listBox.ItemTemplate = (DataTemplate)e.NewValue;
}

现在您可以在托管窗口 XAML 中为该属性设置一个值:

<Window.Resources>
    <Style TargetType="local:MyUserControl">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=PropertyName}"/>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

_listBox在您UserControl将获得一个自定义ItemTemplate,它将响应您要设置为数据源的自定义接口或类。

于 2013-07-30T12:06:03.350 回答