Присоединяемое свойство не найдено в ошибке типа при использовании свойства зависимости в Silverlight

Я пытаюсь создать несколько примеров приложений для использования свойства зависимости в DataGrid, но когда я пытался запустить приложение, я получаю исключение времени выполнения

Присоединяемое свойство SelectedColumnIndex не найдено в типе CustomDependencyProperty. [Строка: 17 Позиция: 74]

Это код, который я использовал для объявления своего свойства зависимости.

public class CustomDependencyProperty : DataGrid
{

    public static DependencyProperty SelectedColumnIndexProperty = DependencyProperty.Register("SelectedColumnIndex",
                                                                                                 typeof(object),
                                                                                                 typeof(DataGrid),
                                                                                                 new PropertyMetadata(0));

    public int SelectedColumnIndex
    {
        get
        {
            return (int)GetValue(SelectedColumnIndexProperty);
        }

        set
        {
            SetValue(SelectedColumnIndexProperty, value);
        }
    }
}

А это мой код XAML

<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  x:Class="BindingDictionary.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:BindingDictionary"
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.Resources>
        <local:SimpleConverter x:Key="myConverter"></local:SimpleConverter>
    </UserControl.Resources>
        <Grid x:Name="LayoutRoot" Background="White">
        <sdk:DataGrid x:Name="dataGrid"
                      AutoGenerateColumns="True"
                      ItemsSource="{Binding Responses}" 
                      local:CustomDependencyProperty.SelectedColumnIndex="{Binding Index,Mode=TwoWay}">
        </sdk:DataGrid>
        <TextBlock x:Name="DisplayIndex" Text="{Binding Index}" />
    </Grid>
</UserControl>

Я не могу понять, в чем проблема. Что-то не так в том, как я объявляю свойство зависимости?

Пожалуйста помоги.

Спасибо алекс


person wizzardz    schedule 20.11.2011    source источник


Ответы (2)


Я думаю, вам понадобится прикрепленное свойство здесь. Попробуйте изменить

DependencyProperty.Register

to

DependencyProperty.RegisterAttached.

Также typeof(object) should be typeof(int).

ОБНОВЛЕНИЕ

Да, приведенное выше устранит вашу проблему, но я думаю, что вам действительно не нужно здесь прикрепленное свойство, поскольку ваш класс расширяет класс DataGrid. Все, что вам нужно - это обычное свойство зависимости. Так что сохраните существующий код и измените

typeof(object),typeof(DataGrid), 

to

typeof(int),typeof(CustomDependencyProperty), 

и в вашем xaml вы можете просто использовать этот расширенный класс напрямую, примерно так:

<local:CustomDependencyProperty SelectedColumnIndex="{Binding Index,Mode=TwoWay}">

Возможно, вы захотите изменить имя CustomDependencyProperty на более значимое, например ExtendedDataGrid.

Итак, я думаю, что вывод состоит в том, что обычно у вас есть два способа создания привязываемого свойства: либо путем расширения элемента управления и создания обычного свойства зависимости, либо путем создания статического класса с присоединенным свойством.

Надеюсь это поможет. :)

person Justin XL    schedule 20.11.2011
comment
да, действительно, изначально это было прикрепленное свойство. Я изменил его на свойство зависимости, чтобы увидеть, в чем разница между свойством зависимости и AttachedPropety. Думаю, теперь я знаю, что пошло не так :) - person wizzardz; 20.11.2011
comment
Я обновил ответ, надеюсь, он прояснит вам разницу между ap и dp. :) - person Justin XL; 20.11.2011
comment
: пометить это как «ответ», так как у него есть лучшее объяснение :) - person wizzardz; 20.11.2011
comment
Спасибо! Ваш тоже верный ответ. :) - person Justin XL; 20.11.2011

Думаю, теперь я могу ответить на этот вопрос. Это исключение просто объясняет, в чем именно разница между AttachedProperty и DependencyProperty.

Чтобы использовать свойство зависимости SelectedColumnIndex, я должен переопределить свой DataGrid xaml следующим образом

<local:CustomDependencyProperty x:Name="customGrid" 
                                 AutoGenerateColumns="True" 
                                 ItemsSource="{Binding Responses}" 
                                 SelectedColumnIndex="{Binding Index, Mode=TwoWay}">
</local:CustomDependencyProperty> 
person wizzardz    schedule 20.11.2011