2011-06-08 56 views
0

我遇到了一个我试图实现的绑定问题。它会更新DP一次,但在此之后,它不会再次更新。将自定义DependencyProperty绑定到ListView.SelectedItem的问题

在XAML中,我有两个控件绑定到一个listview.selected项目。

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

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

预期与ListView的选择项的每一个变化的文字块的更新。

我的定制控件创建依赖属性像这样:

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; 
    } 
    ... 
} 

我几乎在我束手无策,不知道我应该在这里做。任何帮助是极大的赞赏。

回答

0

不确定你想要达到的目标或为什么你的代码显得如此复杂。如果你解释更多的人可能能够为你提供一个更简单的解决方案。

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

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

当你这样做时,MapControl.MapData属性将不再被绑定到“”相反,它会承担您分配的任何价值。因此,您的MapControl.DataContext属性可能是完全正确的,但它并未转移到MapData属性,因为您销毁了该绑定。

+0

谢谢,这确实是罪魁祸首。我一拿出这条线,它就按预期工作。 – 2011-06-10 10:03:55

0

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

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