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

时间:2011-05-23 20:10:49

标签: c# silverlight data-binding silverlight-4.0

我有一个小问题,但已经找到了很多不同的,而且大多是含糊不清的答案:

我有以下用户控件,我正在尝试绑定到该控件(事件)中的公共属性。每个人都说我必须使用数据上下文,但是,我真的不想这样做......我只是想从控件中绑定到属性 XAML ...

要求是绑定必须是2路,因此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。

2 个答案:

答案 0 :(得分:1)

在构造函数中,设置DataContext = this。这将有效地使您的代码支持DataContext。 AFAIK,你不能完全避免使用某些东西使用DataContext。

答案 1 :(得分:1)

您可以使用RelativeSource,因此您不需要DataContext:

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

我不时使用this cheat sheet

编辑糟糕这是WPF语法。请参阅此帖子以查看this post to solve it in Silverlight