DependencyProperty не обновляется [дубликат]

Проблема заключается в методе input.nextInt () - он только считывает значение int. Поэтому, когда вы продолжаете чтение с помощью input.nextLine (), вы получаете ключ «\n» Enter. Поэтому, чтобы пропустить это, вы должны добавить input.nextLine (). Надеюсь, это должно быть ясно сейчас.

Попробуйте это так:

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
1
задан Tim Pohlmann 14 September 2015 в 14:19
поделиться

2 ответа

Вам нужно будет зарегистрировать PropertyChangedCallback с метаданными свойств.

Причина в том, что свойства зависимостей, установленные в XAML или привязками или каким-либо другим источником, не вызывают оболочку CLR (метод сеттера). Причина объясняется в статье XAML по загрузке и зависимости свойств в MSDN:

. По соображениям реализации, это вычислительно дешевле для идентификации свойства как свойства зависимостей и получить доступ к методу SetValue системы свойств, чтобы установить его, а не использовать оболочку свойств и ее сеттер.

...

Поскольку текущая реализация WPF поведения процессора XAML для настройки свойств полностью обходит оболочки, вы не должны вводить какую-либо дополнительную логику в определения множества обертки для вашего пользовательского свойства зависимостей. Если вы установите такую ​​логику в определение набора, тогда логика не будет выполняться, если свойство задано в XAML, а не в коде.

Ваш код должен выглядеть так:

public static readonly DependencyProperty IsClosedProperty =
    DependencyProperty.Register(
        "IsClosed", typeof(bool), typeof(GroupBox),
        new FrameworkPropertyMetadata(false,
            FrameworkPropertyMetadataOptions.AffectsRender,
            (o, e) => ((GroupBox)o).OnIsClosedChanged()));

public bool IsClosed
{
    get { return (bool)GetValue(IsClosedProperty); }
    set { SetValue(IsClosedProperty, value); }
}

private void OnIsClosedChanged()
{
    _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star);
}
5
ответ дан Clemens 28 August 2018 в 17:00
поделиться

Теперь я нашел ответ. ValidateValueCallback действительно близок! (как указал Алекс К). Но это статический метод, и я не получаю никакой ссылки на экземпляр, который был изменен. Ключом является использование PropertyChangedCallback в FrameworkPropertyMetadata, который также является аргументом, переданным методу Property.Register. См.:

public static DependencyProperty IsClosedProperty = DependencyProperty.Register("IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnIsClosedChangedPCC)));

        public bool IsClosed {
            get {
                return (bool)this.GetValue(IsClosedProperty);
            }
            set {
                this.SetValue(IsClosedProperty, value);
                OnIsClosedChanged();
            }
        }



        private static void OnIsClosedChangedPCC(DependencyObject d, DependencyPropertyChangedEventArgs e) {
            GroupBox current = (GroupBox)d;
            current.IsClosed = current.IsClosed;
        }



        private void OnIsClosedChanged() {
            _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star);
        }

Теперь он снова устанавливает IsClosedValue, который запускает запуск OnIsClosedChanged. Спасибо за помощь, ребята!

1
ответ дан Noel Widmer 28 August 2018 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: