WPF Custom присоединенное свойство, которое может быть пустым

Мне нужно создать настраиваемое присоединенное свойство, которое может быть пустым, как показано ниже:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <l:SimpleAttach.MyProperty></l:SimpleAttach.MyProperty>

</Grid>

I tried doing it this way:

public static class SimpleAttach
{
    public static object GetMyProperty(DependencyObject obj)
    {
        return obj.GetValue(MyPropertyProperty);
    }

    public static void SetMyProperty(DependencyObject obj, object value)
    {
        obj.SetValue(MyPropertyProperty, value);
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(object), typeof(SimpleAttach), new PropertyMetadata(null));
}

Но это просто дает ошибку:

Свойство MyProperty не может быть пустым.

Напротив, у MS, похоже, нет проблем с созданием пустых прикрепленных свойств. Вот пример, который не выдает ошибки о том, что он пуст:

    <TextBlock Name="VatAmount" Text="hello world" TextAlignment="Right" Margin="0,0,20,111" HorizontalAlignment="Right" Width="120" Height="16" VerticalAlignment="Bottom">
        <i:Interaction.Behaviors>
        </i:Interaction.Behaviors>
    </TextBlock>

Итак, что мне нужно сделать, чтобы сообщить XAML, что это свойство может быть пустым?


person dayneo    schedule 25.03.2016    source источник
comment
ты имеешь в виду <l:SimpleAttach.MyProperty>null</l:SimpleAttach.MyProperty>   -  person Abin    schedule 25.03.2016
comment
Я имею в виду, что между начальным и конечным тегами не должно быть ничего. Поэтому я ожидаю, что фактическое значение будет нулевым. Рассматривая пример Interaction.Behaviours, я думаю, что это коллекция и поэтому может быть 0 или n элементов.   -  person dayneo    schedule 25.03.2016
comment
Попробуйте установить для свойства ‹x: Null /›   -  person nicolay.anykienko    schedule 25.03.2016
comment
Итак, если немного покопаться, может показаться, что i: Interaction.Behaviors на самом деле является BehaviorCollection. Таким образом, он может иметь 0 элементов в своем списке и, следовательно, может быть пустым в XAML.   -  person dayneo    schedule 26.03.2016


Ответы (1)


Итак, я наконец понял свои проблемы. Иногда полезно прочитать официальную документацию: Подробнее о синтаксисе XAML

В частности, я имел в виду «Свойства содержимого».

Синтаксис содержимого XAML - это синтаксис, который включен только для классов, которые указывают ContentPropertyAttribute как часть своего объявления класса. ContentPropertyAttribute ссылается на имя свойства, которое является свойством содержимого для этого типа элемента (включая производные классы). При обработке процессором XAML любые дочерние элементы или внутренний текст, находящиеся между открывающим и закрывающим тегами элемента объекта, будут присвоены как значение свойства содержимого XAML для этого объекта.

Во-вторых, в примере Microsofts Interactivity.Behaviors, это коллекция, и в ней может быть 0 элементов.

Кроме того, если вы пойдете по пути реализации прикрепленного поведения, которое является коллекцией, то этот пост проведет вас через причуды: Прикрепленное свойство типа list

person dayneo    schedule 30.03.2016