Загрузка XAML в элемент управления во время выполнения и использование ресурсов элемента управления - PullRequest
4 голосов
/ 13 июня 2011

Здесь довольно много вопросов о загрузке XAML во время выполнения, но насколько я могу судить, это не дубликат.

Я загружаю XAML в элемент управления во время выполнения:

<ContentControl Content="{Binding Layout.View, Converter={StaticResource StringToXamlConverter}}"/>

Преобразователь довольно прост:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    string xaml;
    if (value != null)
    {
        xaml = value.ToString();
    }
    else
    {
        xaml = Settings.Default.DefaultLayoutView;
    }

    var root = XamlReader.Parse(xaml);
    return root;
}

Теперь в загружаемом XAML мне нужно использовать ValueConverters.Конвертеры определяются как ресурсы окна, в которое загружается XAML.Например:

<c:BooleanToVisibilityValueConverter x:Key="BooleanToVisibilityConverter"/>

Конечно, метод XamlReader.Parse () выдает исключение, если я пытаюсь использовать этот ресурс, поскольку на момент чтения он недоступен.

Visibility="{Binding Layout.TextItem1.IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"

Есть ли способ обойти это?Возможно, способ заставить XamlReader игнорировать это?Или альтернатива ValueConverters, которая может работать в этой ситуации?

Обратите внимание, что использование DynamicResource также не работает.Они не могут использоваться для ValueConverters.

1 Ответ

5 голосов
/ 13 июня 2011

ОБНОВЛЕНО

ОК, вы правы, динамические ресурсы не будут работать. Я придумал два решения, и самое приятное то, что я протестировал, и оба действительно будут работать.

Вариант 1: определение статического ресурса в ресурсах приложения app.xaml

Вариант 2: не используйте статический ресурс для конвертера, просто создайте конвертер в xaml. Извините, что не вышел из xaml, который вы использовали, но вы поймете, что:

<Button>
    <Button.Visibility>
        <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}">
            <Binding.Converter>
                <controls:BooleanToVisibilityConverter />
            </Binding.Converter>
        </Binding>                   
    </Button.Visibility>

    <Button.Tag>
        <sys:Boolean>True</sys:Boolean>
    </Button.Tag>
</Button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...