C# 如何在Silverlight中绑定到本地属性而不使用DataContext?

C# 如何在Silverlight中绑定到本地属性而不使用DataContext?,c#,silverlight,data-binding,silverlight-4.0,C#,Silverlight,Data Binding,Silverlight 4.0,我有一个小问题,但发现了很多不同的答案,大部分都是模棱两可的: 我有以下用户控件,我正试图绑定到该控件(事件)中的公共属性。每个人都说我必须使用数据上下文,但是,我真的不想这样做。。。我只想从控件的 XAML 要求是绑定必须是双向的,这样ui中的任何更改都将反映在绑定到的属性(或者更确切地说是集合)中。该集合中的每个事件对象还实现INotifyPropertyChanged,更改方式与此控件相同 任何想法都将不胜感激 public partial class EventEditorWindow

我有一个小问题,但发现了很多不同的答案,大部分都是模棱两可的:

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

要求是绑定必须是双向的,这样ui中的任何更改都将反映在绑定到的属性(或者更确切地说是集合)中。该集合中的每个事件对象还实现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);
        }
    }
}
公共部分类EventEditorWindow:UserControl,INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
公众可观察的收集事件;
公共可观测收集事件
{
获取{返回this.events;}
设置
{
if(this.events!=值)
{
这个。事件=值;
本.RaisePropertyChanged(“事件”);
}
}
}
私有void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
这个.VerifyPropertyName(propertyName);
this.PropertyChanged(this,newpropertychangedventargs(propertyName));
}
}
[有条件的(“调试”)]
[调试步骤至]
public void VerifyPropertyName(字符串propertyName)
{
var currentObjectType=this.GetType();
if(currentObjectType.GetProperty(propertyName)==null)
{
抛出新ArgumentException(“未找到属性”,propertyName);
}
}
}
谢谢,
Bleepzter.

在构造函数中,设置DataContext=this。这将有效地使您的代码隐藏在DataContext后面。好了,您不能完全避免将某些内容设置为DataContext。

您可以使用相对资源,这样您就不需要DataContext了:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type EventEditorWindow }}, Path=Events}
我经常使用


编辑Oops这是WPF语法。请参阅此帖子查看

谢谢!我马上试试这个。每当我以编程方式更新集合时,是否也必须添加该行代码?否-PropertyChanged事件将处理您不必处理的问题,否。此外,如果您只是从集合中添加/删除项,则不需要实现INotifyPropertyChanged。observableCollection已经负责添加/删除/清除时的通知。谢谢,您的解决方案成功了。集合中的项实现INotifyPropertyChanged的原因是某些属性确实发生了更改。虽然集合确实负责通知UI集合内的更改,但我发现它不会通知项本身内的更改。非常感谢你的帮助-一切都很有魅力!没问题。事件类应该需要实现INotifyPropertyChanged——您不应该在集合本身(事件属性)上需要它。这没有伤害任何东西,但不应该是必需的。谢谢你的这份备忘单。当我试图实现AncestorType={x:type…}时,我得到的错误排序为“相对资源不实现AncestorType”。。。然而,我发现装订备忘单非常有用!