Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
xpoft2010
Member

Откуда: Оттуда
Сообщений: 184
Добрый день!

Недавно буквально налетел на подводный камень WPF, почему то после прочтения книги MaкДональда была строгая уверенность, что так делать можно.

Имеется 2 класса наследника от DependencyObject, в каждом из них определено по 1 DependencyProperty. Оказалось что нельзя напрямую связать Binding'ом эти 2 св-ва! Более того нельзя определить Binding ни для одного DepProperty определенного в классе напрямую унаследованном от DependencyObject.

При попытке сделать Binding получаю ошибку:
Cannot find governing FrameworkElement or FrameworkContentElement for target element.


Вот xaml разметка, код классов можно посмотреть в исходниках, но там ничего инетересного, просто 2 класса и по 1 DependencyProperty в каждом.

...
        <HeaderedContentControl Header="Здесь привязываю IsChecked к св-ву IsMyActive(Все работает отлично!)">
            <StackPanel>
                <CheckBox Content="Check" IsChecked="{Binding ElementName=evm, Path=IsMyActive}"/>
                <ContentControl>
                    <local:EditVM x:Name="evm" IsMyActive="False"/>
                </ContentControl>
            </StackPanel>
        </HeaderedContentControl>

        <HeaderedContentControl Header="Здесь пытаюсь IWillChange привязать к св-ву IsChecked моего CheckBox'а(Ничего не выходит!)">
            <local:VM IWillChange="{Binding ElementName=Check, Path=IsChecked}"/>
        </HeaderedContentControl>
...


Исходники прилагаются.

К сообщению приложен файл (WpfApplication1.7z - 35Kb) cкачать
19 фев 12, 17:45    [12118500]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
xpoft2010
Member

Откуда: Оттуда
Сообщений: 184
Никто не знает? В этом случае получается, что DependencyProperty определенные в классах унаследованных от DependencyObject теряют полностью свою актуальность... это же бред полный...
19 фев 12, 18:17    [12118556]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
уТКа
Member

Откуда: Страна дураков и разбитых дорог
Сообщений: 1266
xpoft2010,

автор
IWillChange="{Binding ElementName=Check, Path=IsChecked}

где собственно элемент с этим именем?

нет элемента - не будет работать!
19 фев 12, 18:38    [12118610]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
xpoft2010
Member

Откуда: Оттуда
Сообщений: 184
сорри, много вариантов пробовал, не тот выложил, но в любом случае дело не в этом вот исправленный вариант, аналогичная ситуация.


...
<HeaderedContentControl Header="Здесь привязываю IsChecked к св-ву IsMyActive(Все работает отлично!)">
            <StackPanel>
                <CheckBox x:Name="Check1" Content="Check" IsChecked="{Binding ElementName=evm, Path=IsMyActive}"/>
                <ContentControl>
                    <local:EditVM x:Name="evm"/>
                </ContentControl>
            </StackPanel>
        </HeaderedContentControl>

        <HeaderedContentControl Header="Здесь пытаюсь IWillChange привязать к св-ву IsChecked моего CheckBox'а(Ничего не выходит!)">
            <local:VM x:Name="my1" IWillChange="{Binding ElementName=Check1, Path=IsChecked}"/>
        </HeaderedContentControl>
...


System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsChecked; DataItem=null; target element is 'EditVM' (HashCode=55303835); target property is 'IsMyActive' (type 'Boolean')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsChecked; DataItem=null; target element is 'VM' (HashCode=52864749); target property is 'IWillChange' (type 'Boolean')
19 фев 12, 19:01    [12118711]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
уТКа
Member

Откуда: Страна дураков и разбитых дорог
Сообщений: 1266
xpoft2010,

на ум приходит лишь одна мысль "ограниченность видимости ContentControl как у DataTemplate" сейчас проверить не смогу, другая ОС, завтра на работе, если получится.
19 фев 12, 19:35    [12118821]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
xpoft2010
Member

Откуда: Оттуда
Сообщений: 184
уТКа
xpoft2010,

на ум приходит лишь одна мысль "ограниченность видимости ContentControl как у DataTemplate" сейчас проверить не смогу, другая ОС, завтра на работе, если получится.


спасибо, проблема уже решена, действительно ругался из-за того, что не унаследован от FrameworkElement:
вот здесь об этом обсуждение:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/aff23943-5483-40b2-816b-4ce687bc6bf8/

решение оказалось предельно простым и приемлемым:
вот здесь в конце 3 варианта решения этой проблемы, может кому то будет полезным:
http://eladm.wordpress.com/2009/04/08/databinding-tips-tricks/

Я унаследовался от Freezable.
19 фев 12, 20:38    [12118995]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
уТКа
Member

Откуда: Страна дураков и разбитых дорог
Сообщений: 1266
xpoft2010,

все куда проще

К сообщению приложен файл (WpfApplication1.zip - 21Kb) cкачать
20 фев 12, 08:35    [12119974]     Ответить | Цитировать Сообщить модератору
 Re: Как связать 2 DependencyProperty определенных в класса напрямую от DependencyObject?  [new]
xpoft2010
Member

Откуда: Оттуда
Сообщений: 184
Да, будет работать в некоторых сценариях, в частности в этом пробном проекте(куда ж денется то! ) ), но в рабочем проекте мне на мои <local:VM и EditVM>(понятное дело, что там они более внятно), нужно вешать визуализацию через DataTemplate при таком подходе придется делать некоторые выкрутасы, чтобы это реализовать. На мой взгляд будет делать разметку менее читаемой.
Спасибо за помощь!
20 фев 12, 10:59    [12120578]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить