将自定义DependencyProperty绑定到ListView.SelectedItem时出现问题
本文关键字:问题 SelectedItem ListView 自定义 DependencyProperty 绑定 | 更新日期: 2023-09-27 17:58:36
我试图实现的绑定出现问题。它会更新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;
}
...
}
我几乎不知所措,不知道从这里该怎么办。非常感谢您的帮助。
不确定您正试图实现什么,也不确定为什么您的代码看起来如此复杂。如果你解释得更多,有人可能会为你提供一个更简单的解决方案。
也就是说,从声音上看,问题只是你用一个本地值覆盖了绑定。这看起来像罪魁祸首:
((MapControl)source).MapData = (MapData)e.NewValue;
执行此操作时,MapControl.MapData
属性将不再绑定到"相反,它将采用你指定的任何值。因此,您的MapControl.DataContext
属性可能完全正确,但它不会被转移到MapData
属性,因为您已经破坏了绑定。
上周我也犯了同样的错误。我的解决方案很简单:当您显式定义DependencyProperty
时,还必须将模式显式定义为TwoWay。
<TextBlock DataContext="{Binding ElementName=availableMapsListView,
Path=SelectedItem}"
Text="{Binding Name, Mode=TwoWay}" />