Привязка AttachedProperty непосредственно к окну - PullRequest
1 голос
/ 28 марта 2012

Вопрос: Используя XAML, как вы можете установить вложенное свойство непосредственно в окне, когда значение является комплексным значением?

Объяснение:

Обратите внимание, что для краткости я удалил часть кода XAML здесь и там.

Я пытаюсь установить свойство Attached непосредственно в окне WPF.Обычно его можно установить как свойство окна следующим образом:

<Window 
xmlns:data="clr-namespace:MVVM_Test.Data"
data:AttachedProperties.RegisterCommandBindings="somevalue" />

Это хорошо, если для свойства требуется только простое значение (или даже простая привязка).Однако я хочу установить для присоединенного свойства комплексное значение, используя MultiBinding.У меня это работает, когда я делаю Attached Property членом моей Grid:

<Window>
    <Window.Resources>
        <data:BindingConverter x:Key="RegisterCommandBindingsConverter" />
    </Window.Resources>
    <Grid>
        <data:AttachedProperties.RegisterCommandBindings>
            <MultiBinding Converter="{StaticResource RegisterCommandBindingsConverter}">
                <Binding RelativeSource="{RelativeSource Mode=Self}" Path="(data:AttachedProperties.BaseBindings)" />
                <Binding ElementName="automobileView"  Path="DataContext.CommandBindings" />
            </MultiBinding>
        </data:AttachedProperties.RegisterCommandBindings>

Однако я хочу, чтобы присоединенное свойство находилось в Window, а не в Grid.Хотя наличие свойства Attached в Grid делает именно то, что мне нужно, меня беспокоит, что я не могу понять, как установить его в Window.

Если я добавлю привязку Attached Property в качестве первого членаWindow, перед Window.Resources я получаю исключение времени выполнения из XAML-файла Window, в котором указано:

'Предоставить значение' System.Windows.StaticResourceExtension ', вызвавшее исключение.'Номер строки '6' и позиция строки '9'.

с внутренним исключением:

Не удается найти ресурс с именем 'RegisterCommandBindingsConverter'.Имена ресурсов чувствительны к регистру.

Если я добавлю привязку Attached Property после Window.Resources, но все еще как прямой член Window и перед Grid, я получу следующую ошибку во время компиляции:

Объект «Окно» уже имеет дочерний элемент и не может добавить «».«Окно» может принять только одного ребенка.Строка 42, Позиция 11.

1 Ответ

2 голосов
/ 22 марта 2013

Неправильно то, что вы хотите сделать, это то, что вы не можете использовать любой элемент (в данном случае конвертер), определенный в ресурсах окна, в том же окне. Вы должны определить конвертер в словаре внешних ресурсов, например, App.xaml 's ResourcesDictionary. Посмотрите на этот код:

<Application x:Class="WpfApplication3.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <data:BindingConverter x:Key="RegisterCommandBindingsConverter" />
</Application.Resources>

Попробуйте это, я думаю, должно работать. Надежда помогает ...

...