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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Shared Dependency Property in WPF 
:(
    Опции темы
sealmu
  Дата 3.4.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



--------------------------------------------------------------------------------

Почему когда я устонавливаю свойство IntTest прямым присвоением значения (T1.IntTest = 5, T2.IntTest = 10) то значения присваиваються разные, но если я делаю то же через Style то получаю одинаковые значения(10 и 10)?



Код

<Window x:Class="WpfApplication16.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dc="clr-namespace:WpfApplication16"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style x:Key="TestStyle">
            <Setter Property="dc:T1.IntTest" Value="5"/>
            <Setter Property="dc:T2.IntTest" Value="10"/>
        </Style>
    </Window.Resources>
    <StackPanel>
    <StackPanel Background="green" Margin="0,0,0,10">
            <dc:T1 x:Name="t1" IntTest="5" Text="T1 = 5" Background="red"/>
            <dc:T2 x:Name="t2" IntTest="10" Text="T2 = 10" Background="red"/>
        <TextBlock Text="{Binding ElementName=t1, Path=IntTest}"></TextBlock>
        <TextBlock Text="{Binding ElementName=t2, Path=IntTest}"></TextBlock>
    </StackPanel>

        <StackPanel Background="Yellow">
            <dc:T1 x:Name="tt1" Style="{StaticResource TestStyle}" Background="red" Text="T1 = TestStyle"/>
            <dc:T2 x:Name="tt2" Style="{StaticResource TestStyle}" Background="red" Text="T2 = TestStyle"/>
            <TextBlock Text="{Binding ElementName=tt1, Path=IntTest}"></TextBlock>
            <TextBlock Text="{Binding ElementName=tt2, Path=IntTest}"></TextBlock>
        </StackPanel>
    </StackPanel>
</Window>




Код

namespace WpfApplication16
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }





    public class T1 : TextBlock
    {


        // Definition of Dependency property 
        public static readonly DependencyProperty IntTestProperty = DependencyProperty.Register("IntTest", typeof(int), typeof(T1));

        public int IntTest
        {
            get { return (int)GetValue(IntTestProperty); }
            set { SetValue(IntTestProperty, value); }
        }
    }

    // definition of class which uses the dependency property defined above 
    public class T2 : TextBlock
    {
        public static readonly DependencyProperty IntTestProperty = T1.IntTestProperty.AddOwner(typeof(T2));
        public int IntTest
        {
            get { return (int)GetValue(IntTestProperty); }
            set { SetValue(IntTestProperty, value); }
        }


    }


}


Это сообщение отредактировал(а) sealmu - 3.4.2009, 01:43
PM MAIL   Вверх
-Mikle-
Дата 3.4.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Чего вы ходели добиться этим кодом?

У вас один и тот же DP и в Т1 и в Т2... Ваш T2.IntTestProperty это всего лишь AddOwner к свойству T1.IntTestProperty...
То есть вот это:
Код

            <Setter Property="dc:T1.IntTest" Value="5"/>
            <Setter Property="dc:T2.IntTest" Value="10"/>

будет ссылаться на однин м тот-же DP. Чтобы было понятней, то разверните в своем представлении это вот в это:
Код

            <Setter Property="dc:T1.IntTestProperty" Value="5"/>
            <Setter Property="dc:T2.IntTestProperty" Value="10"/>

на самом деле это так и разворачивается внутри WPF. Конкретный экземпляр объекта, к которому это все применится, передается уже во время применения стиля, то есть вот здесь:
Код

            <dc:T1 x:Name="tt1" Style="{StaticResource TestStyle}" Background="red" Text="T1 = TestStyle"/>
            <dc:T2 x:Name="tt2" Style="{StaticResource TestStyle}" Background="red" Text="T2 = TestStyle"/>

Если развернуть это в код, то выделаете так:
Код

    T1 tt1 = new T1();
    tt1.SetValue(T1.IntTestProperty, 5);
    tt1.SetValue(T2.IntTestProperty, 10);

    T2 tt2 = new T2();
    tt2.SetValue(T1.IntTestProperty, 5);
    tt2.SetValue(T2.IntTestProperty, 10);


Так как T1.IntTestProperty и T2.IntTestProperty это одно и то-же свойство, то последними значениями для tt1 и tt2 будет 10. 

А вот этот случай
Код

            <dc:T1 x:Name="t1" IntTest="5" Text="T1 = 5" Background="red"/>
            <dc:T2 x:Name="t2" IntTest="10" Text="T2 = 10" Background="red"/>

разворачивается так:
Код

    T1 tt1 = new T1();
    tt1.SetValue(T1.IntTestProperty, 5);

    T2 tt2 = new T2();
    tt2.SetValue(T2.IntTestProperty, 10);
    // здесь бы сработало даже так
    // tt2.SetValue(T1.IntTestProperty, 10);


Надеюсь я пояснил подробно.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
sealmu
Дата 3.4.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все понял, спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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