Silverlight ChildWindow Размер привязки - PullRequest
3 голосов
/ 27 июня 2011

Я пытаюсь привязать свойство ChildWindow Height к своему свойству viewmodel, но я думаю, что оно считывает только значение VM при первой загрузке и не меняет размер при изменении VM и уведомляет об этом изменении.В отладчике я вижу, что он попадает в блок получения высоты один раз, дальнейшие уведомления не изменяют размер ChildWindow ..

Я думаю, что он должен быть привязываемым, поэтому мне интересно, существует ли здесь какая-то проблема или я делаю какую-то ошибку?

Звучит как одноразовая привязка, но ее односторонний характер.

Height="{Binding WindowHeight,Mode=OneWay}" 

Дальнейшие исследования показывают, что когда мы изменяем привязку на Mode=TwoWay и добавляем пустой установщик, она начинает вести себя как ожидалось.Но это не объясняет причину, по которой привязка OneWay не работает.Также значение, которое передается в setter, равно всей высоте моего приложения, а не только дочернему окну, которое, очевидно, должно быть меньше.

Самое странное в этой ситуации - следующее:

Также это значение передается установщику 4 каждый раз подряд после вызова метода получения (см. count++, который используется для подсчета этого).

Это срабатываетперед тем, как фактически отображается диалоговое окно, и оно всегда идет в последовательности get,set,set,set,set

Код для модели представления очень прост.Нигде в коде никто не использует ChildWindow Height, он установлен только в привязке xaml, как показано выше.

    private int count = 0;
    public int WindowHeight
    {
        get { return IsDefaultMode? DEFAULT_HEIGHT : SPECIAL_HEIGHT; }
        set {count++; }
    }

Мой наследующий класс Childwindow содержит примерно 5 строк текста, ни одна из которых никак не влияет на Height.

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

oks.код установщика режима:

public bool IsSpecialMode
        {
            get { return m_IsSpecialMode; }
            set
            {
                if (m_IsSpecialMode!= value) 
                {
                    m_IsSpecialMode= value;
                    NotifyPropertyChanged("IsSpecialMode");
                    NotifyPropertyChanged("WindowHeight");
                }
            }
        }

1 Ответ

1 голос
/ 27 июня 2011

Если ChildWindow или любой другой объект изменяет свойство Height, ваша привязка будет потеряна. Попробуйте установить для него привязку TwoWay и установить точку останова в установщике свойства WindowHeight вашей модели представления. Это скажет вам, что его настраивает, и можете ли вы иметь привязку OneWay.

Класс ChildWindow фактически установит свои собственные свойства Height и Width. Например, следующий код гарантирует, что ChildWindow всегда покрывает корневой контент вашего приложения. Это позволяет ChildWindow предоставлять эффект наложения или затемнения при отображении его всплывающего окна:

private void UpdateOverlaySize()
{
    if (((this.Overlay != null) && (Application.Current != null)) && ((Application.Current.Host != null) && (Application.Current.Host.Content != null)))
    {
        base.Height = Application.Current.Host.Content.ActualHeight;
        base.Width = Application.Current.Host.Content.ActualWidth;
        // ... other code removed
    }
}

Таким образом, если эффект, похоже, вы не можете использовать привязку OneWay для свойств высоты или ширины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...