转换ContentPresenter的转换器 - 奇怪的结果

时间:2010-09-08 06:35:02

标签: c# wpf

我真的对ContentPresenter感到困惑。

我想构建一个转换器,它具有输入资源名称并返回包含该资源的新实例的新ContentPresenter。 似乎是显而易见的,但是当我在xaml中应用它时,内容将......在使用它的地方之间跳转:

转换器:

   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return null;

        var key = value.ToString();
        var control = new ContentPresenter();
        control.SetResourceReference(ContentPresenter.ContentProperty, key);

        return control;
    }

它需要一个包含资源名称的字符串,并返回带有此资源的新ContentPresenter。

在xaml中我使用了两次:

<Window.Resources>
    <Button x:Key="TestButton" Height="20" Width="30" Content="test"/> 
    <local:SelectResourceConverter x:Key="SelectResourceConverter" />
</Window.Resources>
<StackPanel>
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
</StackPanel>

'Resource'属性在后面的代码中定义:

    public Window1()
    {
        InitializeComponent();
        DataContext = this;
    }
    public string Resource 
    {
        get { return "TestButton"; }
    }

将ContentPresenter更改为ContentControl会在转换器中给出一个例外,即该元素已在可视树中。这给了我一个线索,SetResourceReference()返回两次相同的实例,但我不知道如何更改代码以帮助。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这听起来像是想要使用DataTemplate的场景。

在转换器中设置ContentTemplateProperty:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null)
        return null;

    var key = value.ToString();
    var control = new ContentPresenter();
    control.SetResourceReference(ContentPresenter.ContentTemplateProperty, key);

    return control;
}

在XAML中,定义一个DataTemplate“TestButton”:

<Window.Resources>
    <DataTemplate x:Key="TestButton">
        <Button Height="20" Width="30" Content="test"/> 
    </DataTemplate>
    <local:SelectResourceConverter x:Key="SelectResourceConverter" />
</Window.Resources>
<StackPanel>
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
    <Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
</StackPanel>

如果我没有忘记什么,这应该就够了。通过DataTemplate,您将为Converter创建的每个ContentPresenter获取一个新的Button实例。

你确实知道你的代码中有一个按钮吗?不知道你为什么要这样......