繁体   English   中英

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

[英]Issue with binding custom DependencyProperty to ListView.SelectedItem

我在尝试实现的绑定时遇到问题。 它将更新 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}" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM