gpt4 book ai didi

c# - 扩展 MVVM 的现有控件

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:06 24 4
gpt4 key购买 nike

我正在尝试扩展名为 PivotViewer 的现有 Microsoft 控件。

此控件有一个我想公开给我的 ViewModel 的现有属性。

public ICollection<string> InScopeItemIds { get; }

我创建了一个名为 CustomPivotViewer 的继承类,我想创建一个我可以绑定(bind)到的依赖属性,它将公开基类中 InScopeItemIds 中保存的值。

我花了很长时间阅读有关 DependencyProperty 的内容,现在变得非常沮丧。

这可能吗?

最佳答案

你只需要一个 DependencyProperty 是你想要 是可绑定(bind)的,意思是:如果你想要,例如,一个 MyBindableProperty您控件中的属性,您希望能够使用它执行以下操作:

MyBindableProperty={Binding SomeProperty}

但是,如果您希望其他 DependencyProperties 绑定(bind)到它,任何属性(DependencyProperty或普通的)都可以使用。

我不确定你真正需要什么,也许你可以澄清更多,但如果这是你想要实现的第一个场景,你可以按如下方式进行:

  • 创建一个 DependencyProperty,我们称它为 BindableInScopeItemIds,如下所示:

    /// <summary>
    /// BindableInScopeItemIds Dependency Property
    /// </summary>
    public static readonly DependencyProperty BindableInScopeItemIdsProperty =
    DependencyProperty.Register("BindableInScopeItemIds", typeof(ICollection<string>), typeof(CustomPivotViewer),
    new PropertyMetadata(null,
    new PropertyChangedCallback(OnBindableInScopeItemIdsChanged)));

    /// <summary>
    /// Gets or sets the BindableInScopeItemIds property. This dependency property
    /// indicates ....
    /// </summary>
    public ICollection<string> BindableInScopeItemIds
    {
    get { return (ICollection<string>)GetValue(BindableInScopeItemIdsProperty); }
    set { SetValue(BindableInScopeItemIdsProperty, value); }
    }

    /// <summary>
    /// Handles changes to the BindableInScopeItemIds property.
    /// </summary>
    private static void OnBindableInScopeItemIdsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
    var target = (CustomPivotViewer)d;
    ICollection<string> oldBindableInScopeItemIds = (ICollection<string>)e.OldValue;
    ICollection<string> newBindableInScopeItemIds = target.BindableInScopeItemIds;
    target.OnBindableInScopeItemIdsChanged(oldBindableInScopeItemIds, newBindableInScopeItemIds);
    }

    /// <summary>
    /// Provides derived classes an opportunity to handle changes to the BindableInScopeItemIds property.
    /// </summary>
    protected virtual void OnBindableInScopeItemIdsChanged(ICollection<string> oldBindableInScopeItemIds, ICollection<string> newBindableInScopeItemIds)
    {
    }
  • OnBindableInScopeItemIdsChanged 中,您可以更新内部集合 (InScopeItemIds)

请记住,您要公开的属性是只读(它没有“setter”),因此您可能需要这样更新它:

protected virtual void OnBindableInScopeItemIdsChanged(ICollection<string> oldBindableInScopeItemIds, ICollection<string> newBindableInScopeItemIds)
{
InScopeItemIds.Clear();
foreach (var itemId in newBindableInScopeItemIds)
{
InScopeItemIds.Add(itemId);
}
}

希望这有帮助:)

关于c# - 扩展 MVVM 的现有控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5548489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com