Как привязать к локальному свойству в Silverlight без использования DataContext? - PullRequest
3 голосов
/ 24 мая 2011

У меня небольшой вопрос, но я нашел довольно много разных, и в основном неоднозначных, ответов:

У меня есть следующий пользовательский элемент управления, и я пытаюсь привязать к публичному свойству в этом элементе управления (События). Все говорят, что я должен использовать контекст данных, однако я не хочу этого делать ... Я просто хочу привязать свойство к элементу управления XAML ...

Требование заключается в том, что привязка должна быть двухсторонней, поэтому любые изменения в пользовательском интерфейсе будут отражены в свойстве (или, скорее, в коллекции), к которому она привязана. Каждый объект 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 ]

1 голос
/ 24 мая 2011

Вы можете использовать RelativeSource, поэтому вам не нужен DataContext:

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

Я использую этот чит-лист время от времени.

EDIT Упс, это синтаксис WPF.См. Этот пост, чтобы взглянуть на этот пост, чтобы решить его в Silverlight

1 голос
/ 24 мая 2011

В конструкторе установите DataContext = this. Это эффективно сделает ваш код позади вашего DataContext. AFAIK, вы не можете полностью избежать создания что-то DataContext.

...