用户控件中的绑定

本文关键字:绑定 控件 用户 | 更新日期: 2023-09-27 18:26:59

我创建了一个自定义的用户控件。在一篇博客文章之后,我的控件代码隐藏如下所示:

public BasicGeoposition PinGeoposition
{
    get { return (BasicGeoposition) GetValue(PropertyPinGeoposition); }
    set { SetValueDp(PropertyPinGeoposition, value);}
}
public static readonly DependencyProperty PropertyPinGeoposition = 
    DependencyProperty.Register("PinGeoposition", typeof(BasicGeoposition), typeof(CustomMapControl), null);
public event PropertyChangedEventHandler PropertyChanged;
void SetValueDp(DependencyProperty property, object value, [System.Runtime.CompilerServices.CallerMemberName] String p = null)
{
    ViewModel.SetMode(ECustomMapControlMode.Default);
    SetValue(property, value);
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(p));
}

使用我的控件:

<customControls:CustomMapControl Mode="ForImage" PinGeoposition="{Binding Geoposition, Mode=TwoWay}" Grid.Row="1"/>

最后,在页面的视图模型中,我使用我的控件,我有:

public BasicGeoposition Geoposition
{
    get { return _geoposition; }
    set
    {
        if (Set(ref _geoposition, value))
        {
            RaisePropertyChanged(() => Geoposition);
        }
    }
}

我希望 ViewModel 中地理位置的每一次更改都能反映在 SetValueDp 中。不幸的是,它不起作用。

用户控件中的绑定

不确定杰里·尼克松在他的博客文章中想做什么,因为他没有在任何地方分配他的SetValueDp方法。

如果你想调用它,你可以做这样的事情:

public static readonly DependencyProperty PropertyPinGeoposition = 
DependencyProperty.Register("PinGeoposition", typeof(BasicGeoposition), typeof(CustomMapControl), new PropertyMetadata(null, SetPosition));
public BasicGeoposition PinGeoposition 
{ 
    get { return (BasicGeoposition) GetValue(PropertyPinGeoposition); } 
    set { SetValue(PropertyPinGeoposition, value);}
}
private static void SetPosition(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    var control = (CustomMapControl)sender;
    var position = e.NewValue as BasicGeoposition;
    // Do whatever
}

编辑:在阅读并重新阅读博客文章后,我想我把它倒过来了(你可能也是(。根据我现在的理解,SetValueDp 是一个帮助程序方法,每当你想要更改依赖项属性的值时,你应该调用。这不是自动调用的东西。因此,如果您想要一个在修改 DP 时调用的方法,请检查我的解决方案。