Проблема с привязкой пользовательского DependencyProperty к ListView.SelectedItem - PullRequest
0 голосов
/ 08 июня 2011

У меня проблема с привязкой, которую я пытаюсь реализовать.Он будет обновлять DP один раз, но после этого он никогда не будет обновляться снова.

В XAML у меня есть два элемента управления, привязывающих к элементу listview.selected.

<controls:MapControl DataContext="{Binding ElementName=availableMapsListView, Path=SelectedItem}" MapData="{Binding .}">

и

<TextBlock DataContext="{Binding ElementName=availableMapsListView, Path=SelectedItem}" Text="{Binding Name}" />

Обновление текстового блока, как и ожидалось, при каждом изменении выбранного элемента списка.

Мой пользовательский элемент управления создает свойство зависимости следующим образом:

public class MapControl : UserControl
{
  public MapData MapData
    {
        get { return (MapData)GetValue(MapDataProperty); }
        set { SetValue(MapDataProperty, value); }
    }

    public static readonly DependencyProperty MapDataProperty =
        DependencyProperty.Register("MapData", typeof(MapData), typeof(MapControl),
            new FrameworkPropertyMetadata(
                null,
                FrameworkPropertyMetadataOptions.AffectsRender,
                new PropertyChangedCallback(OnMapDataPropertyChanged),
                new CoerceValueCallback(OnMapCoerceValue)
            )
        );

    private static void OnMapDataPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue != null)
        {
            ((MapControl)source).MapData = (MapData)e.NewValue;                
        }
    }

    private static object OnMapCoerceValue(DependencyObject dpo, Object obj)
    {           
        return obj;
    }
    ...
}

Я почти сошел с ума и не уверен, что мне следует делать отсюда.Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

У меня была такая же ошибка на прошлой неделе.Мое решение было простым: когда вы явно определяете DependencyProperty, вы также должны явно определять режим для TwoWay.

<TextBlock DataContext="{Binding ElementName=availableMapsListView,
 Path=SelectedItem}"
 Text="{Binding Name, Mode=TwoWay}" />
0 голосов
/ 08 июня 2011

Не знаю точно, чего вы пытаетесь достичь или почему ваш код выглядит настолько запутанным. Если вы объясните больше, кто-то может предложить вам более простое решение.

Тем не менее, судя по всему, проблема в том, что вы просто перезаписываете привязку локальным значением. Это похоже на виновника:

((MapControl)source).MapData = (MapData)e.NewValue;

Когда вы это сделаете, свойство MapControl.MapData больше не будет связано с '.' Вместо этого он будет принимать любое назначенное вами значение. Таким образом, ваше свойство MapControl.DataContext, вероятно, совершенно правильно, но оно не передается в свойство MapData, поскольку вы уничтожили привязку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...