WPF: Невозможно установить свойства странности элементов свойств - PullRequest
10 голосов
/ 12 октября 2009
private TextBlock _caption = new TextBlock();

public TextBlock Caption  
{  
    get { return _caption; }  
    set { _caption = value; }  
}

<l:CustomPanel>  
    <l:CustomPanel.Caption Text="Caption text" FontSize="18" Foreground="White" />  
</l:CustomPanel>

Дает мне следующую ошибку:
Невозможно установить свойства для элементов свойства.

Если я использую:

<l:CustomPanel>  
    <l:CustomPanel.Caption>
        <TextBlock Text="Caption text" FontSize="18" Foreground="White" /> 
    </l:CustomPanel.Caption>
</l:CustomPanel>

Мой TextBlock отображается нормально, но он вложен в другой TextBlock, например, даже кажется, что он добавляется вне свойства Caption:

<l:CustomPanel>  
    <l:CustomPanel.Caption>
        <TextBlock>
             <InlineUIContainer>
                 <TextBlock Text="Caption text" FontSize="18" Foreground="White" /> 
             </InlineUIContainer>
        </TextBlock>
    </l:CustomPanel.Caption>

    <TextBlock>
         <InlineUIContainer>
             <TextBlock Text="Caption text" FontSize="18" Foreground="White" /> 
         </InlineUIContainer>
    </TextBlock>
</l:CustomPanel>

Как вы, возможно, уже догадались, я хотел бы, чтобы мой код устанавливал свойство Caption из XAML на пользовательской панели, если это возможно.

Я также пробовал тот же код с DependencyProperty, но безрезультатно.

Так, кто-нибудь, кто может помочь мне с этой проблемой?

Ответы [ 3 ]

13 голосов
/ 12 мая 2010

Я могу объяснить, что происходит и как это исправить.

Во-первых,

<l:CustomPanel>
  <l:CustomPanel.Caption Text="Caption text" FontSize="18" Foreground="White" />

- это простая синтаксическая ошибка.Синтаксис <l:CustomPanel.Caption> не принимает атрибуты XML - значение свойства должно находиться внутри элемента.

Это правильный синтаксис элемента свойства:

<l:CustomPanel>    
  <l:CustomPanel.Caption>  
    <TextBlock Text="Caption text" FontSize="18" Foreground="White" />   
  </l:CustomPanel.Caption>  
</l:CustomPanel>

, но:

  1. Синтаксис элемента свойства работает только с DependencyProperties (поэтому он не работает с вашим свойством CLR) и
  2. Синтаксис элемента свойства всегда учитывает атрибут ContentPropertyAttribute типа свойства

Так какTextBlock имеет [ContentPropertyAttribute ("Inlines")], синтаксис элемента свойства пытается добавить TextBlock в коллекцию Inlines.

Решение простое: объявите свое свойство как DependencyProperty типа UIElement вместо типа TextBlock .Это имеет дополнительное преимущество, заключающееся в том, что вы не ограничиваете отображение контента только TextBlock.Если вы действительно хотите ограничить его только TextBlock, вы можете использовать обратный вызов проверки.

public UIElement Content { get { ...
public static readonly DependencyProperty ContentProperty = ...
2 голосов
/ 12 октября 2009

Только что получил неидеальный обходной путь от моего коллеги. Он включает в себя объявление свойства Caption как ресурса:

<Page.Resources>
    <TextBlock x:Key="test" Text="Caption text" FontSize="18" Foreground="White" />
</Page.Resources>

<l:CustomPanel Caption="{StaticResource test}" />

Я все еще хотел бы знать, почему я не могу использовать два предыдущих варианта, поэтому, если кто-нибудь знает, пожалуйста, ответьте. :)

0 голосов
/ 08 декабря 2011

Кажется, что вы можете получить эту ошибку (по крайней мере, в Silverlight 4 и 5), если указали пространство имен для элемента. Например:

<Path>
    <MapLayer.Position xmlns="clr-namespace:Microsoft.Maps.MapControl">
        ...

В этом случае MapLayer.Position является вложенным свойством. Похоже, что синтаксическому анализатору Silverlight требуется определить пространство имен с помощью префикса:

<Path xmlns:map="clr-namespace:Microsoft.Maps.MapControl">
    <map:MapLayer.Position>
        ...
...