конвертер, возвращающий ContentPresenter - странный результат - PullRequest
1 голос
/ 08 сентября 2010

Я действительно запутался с 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 Ответ

2 голосов
/ 08 сентября 2010

Это действительно похоже на сценарий, в котором вы хотите вместо этого использовать 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 определите шаблон данных «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 вы получите новый экземпляр вашей кнопки для каждого ContentPresenter, который создает конвертер.

Вы понимаете, что вы получите кнопку в кнопке с вашим кодом? Не уверен, почему ты этого хочешь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...