绑定到自定义控件属性

本文关键字:属性 自定义控件 绑定 | 更新日期: 2023-09-27 18:10:18

我正在开发一个帐户列表下拉控件,这将在我的应用程序中使用。下拉菜单将调用一个服务并检索可用帐户列表,并为下拉菜单中选中的项目公开一个属性"SelectedAccount"。SelectedAccount将是一个DependencyProperty,因为它必须由AccountDropdown控件的消费者绑定,并且它必须是双向绑定的,因此它反映了一个现有的SelectedAccount。

AccountDropdown。asmx很简单,它包含一个ComboBox:

<ComboBox SelectedItem="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"...

组合框的选定项绑定到注册为

的属性。
DependencyProperty.Register("SelectedAccount", typeof(IAccount), typeof(AccountDropdown),
                                new UIPropertyMetadata(null));

…还有常用的属性:

    #region SelectedAccount
    /// <summary>
    /// Selected account
    /// </summary>
    public IAccount SelectedAccount
    {
        get { return (IAccount)GetValue(SelectedAccountProperty); }
        set { SetValue(SelectedAccountProperty, value); }
    }
    #endregion SelectedAccount

属性在代码隐藏文件中定义…数据上下文设置为"this"…这样绑定设置就正确了。

当我使用这个控件时,我需要将SelectedAccount绑定到另一个视图的ViewModel属性,例如:

<Controls:AccountDropdown SelectedAccount="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

当我运行上面的代码,并改变下拉菜单上的选择时,我得到了一个System。StackOverflow例外。我甚至不能调试它,异常是从Windows.Base.dll抛出的。

我已经为此挣扎了一天了…任何帮助都会很感激。

**注意:**我已经写了几个WPF控件与依赖属性,他们工作得很好,但是当我使用它们时,我在.asmx文件中显式地提供了值。在这个例子中,当我使用属性时,我又绑定了。我猜,暴露一个可绑定属性可能需要一些额外的技巧。

绑定到自定义控件属性

好吧,就像通常的情况一样,解决方案很简单。AccountDropdown控件的DataContext被隐式地设置为自身,因此产生了无限循环。只需指定DataContext来使用正在使用控件的DataContext(因此使用预期的ViewModel绑定):

<Controls:AccountDropdown DataContext="{Binding}" SelectedAccount="{Binding Path=SelectedAccount, Mode=TwoWay}" />

我仍然要弄清楚如何告诉控件使用容纳它的控件的数据上下文…如果我弄明白了,我会把它贴在这里…如果有人知道,请告诉我。

再次感谢那些回应的人

我猜SelectedAccountChanged方法更新字段,从而导致无限递归,导致堆栈溢出。

要测试:从DependencyProperty中删除SelectedAccountChanged。注册调用以确保这是错误的来源,然后检查方法本身。

如果你需要帮助,把方法贴在那里