如何在不使用DataContext的情况下绑定到Silverlight中的本地属性

本文关键字:Silverlight 属性 绑定 情况下 DataContext | 更新日期: 2023-09-27 17:57:33

我有一个小问题,但一直在寻找一些不同的、大多模棱两可的答案:

我有以下用户控件,我正试图绑定到该控件中的公共属性(Events)。每个人都说我必须使用数据上下文,然而,我真的不想这么做。。。我只想从控件的XAML。。。

要求绑定必须是双向的,这样ui中的任何更改都将反映在它绑定到的属性(或者更确切地说是集合)中。该集合中的每个Event对象也以与此控件相同的方式实现INotifyPropertyChanged。。。

任何想法都将不胜感激!

public partial class EventEditorWindow : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public ObservableCollection<Event> events;
    public ObservableCollection<Event> Events
    {
        get { return this.events; }
        set
        {
            if( this.events != value )
            {
                this.events = value;
                this.RaisePropertyChanged("Events");
            }
        }
    }
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            this.VerifyPropertyName(propertyName);
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    [Conditional("DEBUG")]
    [DebuggerStepThrough]
    public void VerifyPropertyName(string propertyName)
    {
        var currentObjectType = this.GetType();
        if (currentObjectType.GetProperty(propertyName) == null)
        {
            throw new ArgumentException("Property not found", propertyName);
        }
    }
}

谢谢,Bleepzter。

如何在不使用DataContext的情况下绑定到Silverlight中的本地属性

在构造函数中,设置DataContext=this。这将有效地使您的代码落后于DataContext。AFAIK,您无法完全避免使成为的DataContext。

您可以使用RelativeSource,这样您就不需要DataContext:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type EventEditorWindow }}, Path=Events}

我不时地用这个备忘单。

EDIT抱歉,这是WPF语法。请参阅这篇文章,了解这篇文章在Silverlight 中的解决方案