lexxpavlov
@lexxpavlov
Программист, преподаватель

Как установить привязку к UserControl от вьюмодели?

Странное поведение привязки к двум разным свойствам зависимости у одного объекта. Есть вьюмодель Game, имеющая три свойства - Red, Blue и Turn. Вьюмодель устанавливается в DataContext. Также есть юзерконтрол MageControl установленной вьюмоделью Mage. Привязываю к MageControl.DataContext одно из свойств Game - всё отлично работает, студия подсказывает, какое свойство устанавливать из вьюмодели (Red или Blue).
<Window ...>
    <Window.DataContext>
        <game:Game/>
    </Window.DataContext>
    <local:MageControl DataContext="{Binding Red}"/> <!-- всё отлично работает -->
</Window>


Теперь пытаюсь передать в юзерконтрол ссылку на текущую вьюмодель, создал свойство зависимости, и пытаюсь привязать к ней данные из вьюмодели.
public partial class MageControl : UserControl
{
    public int Turn
    {
        get { return (int)GetValue(TurnProperty); }
        set { SetValue(TurnProperty, value); }
    }

    public static DependencyProperty TurnProperty = DependencyProperty.Register("Turn", typeof(int), typeof(MageControl));
}

Теперь пытаюсь привязать данные:
<Window ...>
    <Window.DataContext>
        <game:Game/>
    </Window.DataContext>
    <StackPanel>
        <local:MageControl DataContext="{Binding Red}"/> <!-- привязка к DataContext отлично работает -->
        <local:MageControl DataContext="{Binding Blue}" Turn="{Binding Turn}"/> <!-- привязка к Turn не работает! -->
    </StackPanel>
</Window>

При попытке привязывания к свойству Turn не предлагает варианты из вьюмодели (хочу привязать Turn), а предлагает варианты из вьюмодели MageControl.

В общем, вопрос в следующем - почему у разных свойств одного элемента предлагается разный набор свойств для привязки. К свойству MageControl.DataContext предлагается набор свойств от вьюмодели окна, а к свойству MageControl.Turn предлагается набор свойств из вьюмодели MageControl.

Если настроить привязку к родителю - то предлагает что надо:
<local:MageControl DataContext="{Binding Red}"
     Turn="{Binding Turn, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type game:Game}}}" /> <!-- работает -->

Но привязка не работает - не срабатывает ни разу.
  • Вопрос задан
  • 463 просмотра
Решения вопроса 1
@Sumor
<Window ...>
    <Window.DataContext>
        <game:Game/>
    </Window.DataContext>
    <StackPanel>
        <local:MageControl DataContext="{Binding Red}"/> <!-- привязка к DataContext отлично работает -->
        <local:MageControl DataContext="{Binding Blue}" Turn="{Binding Turn}"/> <!-- привязка к Turn не работает! -->
    </StackPanel>
</Window>

Привязка без указания источника привязывается к DataContext. Смотрим внимательно на привязки:
{Binding Red} - DataContext ещё не установлен, у родителя DataContext - Game. Поэтому будет привязка к Game.Red.
{Binding Blue} - DataContext ещё не установлен, у родителя DataContext - Game. Поэтому будет привязка к Game.Blue.
{Binding Turn} - DataContext будет установлен при загрузке в Game.Blue. Поэтому будет привязка к Game.Blue.Turn.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MonkAlex
C#, SQL, Delphi, C++ etc
Интелисенс в студии иногда не работает совсем, иногда врёт, иногда тормозит всё дико.

Потому, советую попробовать забить данные по логике, как в самом верху написано, проверить работает ли так.

В отладке неплохо помогает Snoop, плюс студия умела вроде писать об ошибках биндинга в Output.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы