Модераторы: gambit, Kefir, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DependencyProperty и DependencyObject, что-то я не понимаю 
:(
    Опции темы
Larrr
Дата 9.1.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Привет, уважаемые. Вопрос такой:

Мне надо сделать UserControl со свойством PropertyName, который потом можно было бы использовать в другом окне. Причем прямо набиндить PropertyName:

Код

<typescontrol:DataTypeControl Name="DataTypesENFControl" PropertyName="{Binding Name}">
</typescontrol:DataTypeControl>


(который потом не меняется - мне достаточно его один раз записать и запомнить).

Я уже нашла, что PropertyName должен быть DependencyProperty. Как было написано в моей умной книжке, я сделала так:

Код

 public partial class DataTypeControl : UserControl
    {
        public static readonly DependencyProperty PropertyNameProperty = 
            DependencyProperty.Register("PropertyName", typeof(String), typeof(DataTypeControl));
        
        
        public String PropertyName
        {
            set
            {
                SetValue(PropertyNameProperty, value);
            }
            get
            {
                return GetValue(PropertyNameProperty).ToString();
            }
        }
    ...
    }



Проблема в том, что оно не работает. При попытке набиндить что-то в PropertyName пишется ошибка 

"A 'Binding' cannot be set on the 'PropertyName' property of type 'DataTypeControl'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject."

Где ошибка, как сделать так, чтобы оно работало?
PM MAIL WWW ICQ   Вверх
Adm0r
Дата 11.1.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



попробуйте так
Код

 public partial class DataTypeControl : UserControl
    {
        private String propertyName
        public static readonly DependencyProperty PropertyNameProperty = 
            DependencyProperty.Register("PropertyName", typeof(String), typeof(DataTypeControl), new PropertyMetadata(new PropertyChangedCallback(DataTypeControl.OnPropertyNameChanged)));
        private static void OnPropertyNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
       {
           ((DataTypeControl)d).propertyName = e.NewValue.ToString();
       }
        
        public String PropertyName
        {
            set
            {
                SetValue(PropertyNameProperty, value);
            }
            get
            {
                return GetValue(PropertyNameProperty).ToString();
            }
        }
    ...
    }

PM MAIL   Вверх
Partizan
Дата 11.1.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Adm0r, разница какая между вашим кодом и кодом Larrr?))))


Larrr, в вашем коде всё правильно вроде...проблема ещё не решилась?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Adm0r
Дата 12.1.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



Partizan,  разница в том что мой код работает, а код 
Larrr, - нет

Я практик, а не теоретик, поэтому популярно обьяснить не смогу, - но  код Larrr, не предоставляет механизм изменения DependencyProperty как свойсва DependencyObject. 

Это сообщение отредактировал(а) Adm0r - 12.1.2009, 11:46
PM MAIL   Вверх
Partizan
Дата 13.1.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Цитата

Я практик, а не теоретик, поэтому популярно обьяснить не смогу, - но  код Larrr, не предоставляет механизм изменения DependencyProperty как свойсва DependencyObject. 


Тогда советую пойти и подучить матчасть....ваш код избыточен....в нём много лишнего...


Larrr, я накидал примерчик...у меня всё работает...

Код

    /// <summary>
    /// Interaction logic for DataTypeControl.xaml
    /// </summary>
    public partial class DataTypeControl : UserControl
    {


        public string PropertyName
        {
            get { return (string)GetValue(PropertyNameProperty); }
            set { SetValue(PropertyNameProperty, value); }
        }

        // Using a DependencyProperty as the backing store for PropertyName.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PropertyNameProperty =
            DependencyProperty.Register("PropertyName", typeof(string), typeof(DataTypeControl), new UIPropertyMetadata(""));



        public DataTypeControl()
        {
            InitializeComponent();
        }
    }


Код

<Window x:Class="My_WPF_Tests.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace:My_WPF_Tests"
    Title="Window1" Height="300" Width="300" Name="mainWnd">
    <Grid>
        <DockPanel x:Name="dockPanel">
            <src:DataTypeControl PropertyName="{Binding ElementName=mainWnd, Path=Name}" DockPanel.Dock="Top" Height="100" HorizontalAlignment="Stretch" Width="280" />
            <Button Click="Button_Click" DockPanel.Dock="Bottom" Height="20">OK</Button>
        </DockPanel>
    </Grid>





--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Adm0r
Дата 14.1.2009, 11:46 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



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

ПС. Если вы накидали примерчик, то могли бы не копипастить в СВОЙ код чужые коментарии.
Первый C# код сворован у ВАС в точности до знака.(почти - идентификатор свойсва изменился)

Это сообщение отредактировал(а) Adm0r - 14.1.2009, 11:58
PM MAIL   Вверх
Partizan
Дата 14.1.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Adm0r, мы не злые - это раз...

по поводу второго - опять же могу только посоветовать подучить матчасть....


p.s. обвиняете меня в плагиате????  smile 
это меня действительно чуть-чуть раздражает...

совет: прежде чем разбрасываться голословнми обвинениями,
почитайте про code snippets и попробуйте попользовать code snippet для генерации dependency property...сразу все подозрения отпадут...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Adm0r
Дата 14.1.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



простите если обидел. У меня в студии code snippets просто генерирует абсолютно непохожий код, вот я и подумал... извините.

по поводу учить матчасть, вы уж извините, но адекватно посылать учить матчасть принято с ссылкой на ту самую матчасть. В противном случае у собеседника создается впечатление что вы его посылаете на 3 веселых буквы.
PM MAIL   Вверх
Partizan
Дата 14.1.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Adm0r, асболютно непохожий - это какой  smile 

Матчасть: http://msdn.microsoft.com/en-us/library/ms752914.aspx


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Adm0r
Дата 14.1.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



Код

public static global::System.Workflow.ComponentModel.DependencyProperty MyPropertyProperty = global::System.Workflow.ComponentModel.DependencyProperty.Register("MyProperty", typeof(string), typeof(UnigueList));

        [System.ComponentModel.DescriptionAttribute("MyProperty")]
        [System.ComponentModel.CategoryAttribute("MyProperty Category")]
        [System.ComponentModel.BrowsableAttribute(true)]
        [System.ComponentModel.DesignerSerializationVisibilityAttribute(System.ComponentModel.DesignerSerializationVisibility.Visible)]
        public string MyProperty
        {
            get
            {
                return ((string)(base.GetValue(UnigueList.MyPropertyProperty)));
            }
            set
            {
                base.SetValue(UnigueList.MyPropertyProperty, value);
            }
        }

мсдн у меня и на машине есть....ладно, можете мне не отвечать, все равно тут на форуме учиться не у кого...я ушел. Всем пока
PM MAIL   Вверх
Partizan
Дата 14.1.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Adm0r, мде....подумал с ходу, что код С++...у вас DependencyProperty не оттуда берётся)

Добавлено через 3 минуты и 13 секунд
такое ощущение, что Вы создали проект WWF....

Это сообщение отредактировал(а) Partizan - 14.1.2009, 14:28


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
namespace
Дата 19.2.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



есть мой контрол, при его использовании в конкретном окне мне необходимо установить ширину колонки грида (корневой элемент в
контроле и окне Grid), хотел что бы эта ширина биндилась в хамле при определнии контрола написал так:
Код

<Products:ProductControl Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="3" 
      LabelWidth="{Binding ElementName=grid, Path=ColumnDefinitions[0].Width}" x:Name="productControl" />

в самом контроле сделал Dependency свойство:
Код

        public GridLength LabelWidth
        {
            get
            {
                return (GridLength)this.GetValue(LabelWidthProperty);
            }
            set
            {
                this.SetValue(LabelWidthProperty, value);
            }
        }

        public static readonly DependencyProperty LabelWidthProperty =
            DependencyProperty.Register("LabelWidth", typeof(GridLength), typeof(ColumnDefinition), new UIPropertyMetadata(new
            GridLength(100),new PropertyChangedCallback(OnLabelWidthChanged)));

        private static void OnLabelWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((ColumnDefinition)d).Width = (GridLength)e.NewValue;
        }

получаю исключение:
Error    1    A 'Binding' cannot be set on the 'LabelWidth' property of type 'ProductControl'. 
A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
в чем я не прав?



Это сообщение отредактировал(а) namespace - 19.2.2009, 21:48
PM MAIL   Вверх
Partizan
Дата 19.2.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



namespace, ProductControl от кого наследуется?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
namespace
Дата 19.2.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



UserControl
PM MAIL   Вверх
Partizan
Дата 19.2.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



namespace, а почему Owner-ом выставлен класс ColumnDefinition??????

Цитата

 typeof(ColumnDefinition)


Выставьте вместо ColumnDefinition класс ProductControl


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.