将自定义DependencyProperty绑定到ListView.SelectedItem的问题

时间:2011-06-08 13:23:10

标签: c# wpf xaml

我遇到了我正在尝试实施的绑定问题。它会更新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 :(得分:0)

不确定您要实现的目标是什么,或者为什么您的代码看起来如此错综复杂。如果你解释得更多,有人可能会为你提供一个更简单的解决方案。

那就是说,通过它的声音,问题只是你用本地值覆盖绑定。这看起来像罪魁祸首:

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

执行此操作时,MapControl.MapData属性将不再绑定到“。”相反,它将承担您分配的任何价值。所以你的MapControl.DataContext属性可能完全正确,但它没有被转移到MapData属性,因为你已经破坏了绑定。

答案 1 :(得分:0)

上周我犯了同样的错误。我的解决方案很简单:当你明确定义DependencyProperty时,你还必须明确地将模式定义为TwoWay。

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