2011-01-02 4 views
1

Я работаю с прикрепленными свойствами и придумал интересный теоретический вопрос. Я знаю, что если я хочу, чтобы установить вложенное свойство через XAML, я использую формат:Что такое префикс прикрепленного свойства, которое присоединяет подкласс?

<control ownerClass.propertyName="some value"/> 

Мой вопрос, что произойдет, если я получить класс от «ownerClass». Например, если я определяю следующий класс:

class MyGrid : Grid { 
} 

Пробовал установить его через XAML следующим образом

<MyGrid> 
    <Button MyGrid.Row = "0">Bla Bla</Button> 
</MyGrid> 

Но IntelliSense не подведи меня. Когда я использовал собственное пространство имен в прикрепленном свойстве, он сработал.

Кроме того, это позволило мне сделать это:

<MyGrid> 
    <Button Grid.Row = "0">Bla Bla</Button> 
</MyGrid> 

Это имеет смысл, конечно, так как Row вложенное свойство является статическим членом сетки класса и определяется им. Единственная проблема здесь в том, что пользователи моего нового класса узнают, что они были получены из Grid, и что это конкретное свойство было определено предком. Мне кажется, что это детали реализации, которые я бы не хотел показывать пользователям моего класса.

Есть ли способ получить WPF до скрыть факт, что это вложенное свойство было фактически определено суперклассом?

Спасибо,

Коби

+0

Просто чтобы прояснить, Meleak решил исходную задачу (Thnx для этого, Meleak), но я все еще интересно, если есть способ «скрыть» детали реализации и не разрешать пользователю получать доступ к прикрепленному свойству с помощью префикса суперкласса. Если в будущем я решит изменить реализацию, поэтому я не использую класс Grid как суперкласс, он все равно будет работать одинаково, поэтому я бы предпочел, чтобы пользователи не подвергались факту, что этот класс был унаследован от Класс сетки. –

+0

Вы хотите скрыть Grid.Row от intellisence или вы хотите отключить funtionality Grid.Row или оба? –

ответ

2

Я не уверен, я вижу проблему. Я пробовал это, и это работает. Кроме того, работа была выполнена. Какую версию .NET вы используете и какую версию VisualStudio? Я попытался это с .NET 4.0 и VS2010

<local:MyGrid> 
    <local:MyGrid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </local:MyGrid.ColumnDefinitions> 
    <Button local:MyGrid.Column="1" Content="Button1"/> 
    <Button local:MyGrid.Column="0" Content="Button2"/> 
</local:MyGrid> 

public class MyGrid : Grid 
{ 
    public MyGrid() { } 
} 
+0

Вы на самом деле правы. Оказалось, что я не использовал правильное пространство имен для самого свойства. –

+0

@ Kobi Hari: Хорошо :) Рад, что вы сработали! –

+0

Спасибо :-). Но я все еще ищу способ скрыть возможность «Grid.Row». Я хочу, чтобы производный класс использовался так же, как и любой другой класс, и не хотел бы, чтобы к связанным свойствам обращались по-разному, только потому, что я получал свой класс из Grid вместо его реализации полностью самостоятельно. Вы случайно знаете, как это сделать? –