2014-12-24 3 views
1

Я создал новый пользовательский элемент управления. Я хотел бы услышать, когда свойство Видимость изменилось, чтобы я мог выполнять дополнительную работу одновременно. Я знаю, что это свойство зависимостей, но это не тот, который я создал, поэтому я стараюсь понять, как подключиться к нему. В приложениях WinRT отсутствует метод OverrideMetadata, который, как представляется, является наиболее распространенным способом для этого. Я также попытался создать новое свойство зависимостей, зарегистрированное для существующего имени свойства, но этот обратный вызов никогда не запускался.Как прослушать изменение значения свойства из usercontrol

Должен полагать, что есть какой-то способ для объекта зависимостей слушать его собственные изменения свойств. Что мне не хватает?

ответ

3

Я использовал что-то вроде этого в своем пользовательском контроле. Затем вы можете подписаться на событие VisibilityChanged. Обратите внимание, что я использую ключевое слово new в свойстве.

/// <summary> 
    /// The current visiblity of this user control. 
    /// </summary> 
    private Visibility _visibility; 

    /// <summary> 
    /// Gets or sets the visibility of a UIElement. 
    /// A UIElement that is not visible is not rendered and does not communicate its desired size to layout. 
    /// </summary> 
    /// <returns>A value of the enumeration. The default value is Visible.</returns> 
    public new Visibility Visibility 
    { 
     get { return _visibility; } 
     set 
     { 
      bool differ = false; 
      if (value != _visibility) 
      { 
       _visibility = value; 
       differ = true; 
      } 

      base.Visibility = value; 

      if (differ) 
      { 
       RaiseVisibilityChanged(value); 
      } 
     } 
    } 


    /// <summary> 
    /// Raised when the <see cref="Visibility"/> property changes. 
    /// </summary> 
    public event EventHandler<VisibilityChangedEventArgs> VisibilityChanged; 

    /// <summary> 
    /// Raises the <see cref="VisibilityChanged"/> event of this command bar. 
    /// </summary> 
    /// <param name="visibility">The new visibility value.</param> 
    private void RaiseVisibilityChanged(Visibility visibility) 
    { 
     if (VisibilityChanged != null) 
     { 
      VisibilityChanged(this, new VisibilityChangedEventArgs(visibility)); 
     } 
    } 

    /// <summary> 
    /// Contains the arguments for the <see cref="SampleViewModel.VisibilityChanged"/> event. 
    /// </summary> 
    public sealed class VisibilityChangedEventArgs : EventArgs 
    { 
     /// <summary> 
     /// The new visibility. 
     /// </summary> 
     public Visibility NewVisibility { get; private set; } 

     /// <summary> 
     /// Initializes a new instance of the <see cref="VisibilityChangedEventArgs"/> class. 
     /// <param name="newVisibility">The new visibility.</param> 
     /// </summary> 
     public VisibilityChangedEventArgs(Visibility newVisibility) 
     { 
      this.NewVisibility = newVisibility; 
     } 
    } 
+0

Это замечательно. Я заметил, что он не обрабатывает начальное состояние видимости моего usercontrol правильно; кажется, что управление видимо, когда оно загружено, даже если XAML, содержащий элемент управления, устанавливает управление, которое должно быть свернуто изначально. Я подозреваю, что я сделал что-то неправильно или это легко исправить. –