Проблема заключается в методе 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();
Вам нужно будет зарегистрировать PropertyChangedCallback с метаданными свойств.
Причина в том, что свойства зависимостей, установленные в XAML или привязками или каким-либо другим источником, не вызывают оболочку CLR (метод сеттера). Причина объясняется в статье XAML по загрузке и зависимости свойств в MSDN:
. По соображениям реализации, это вычислительно дешевле для идентификации свойства как свойства зависимостей и получить доступ к методу SetValue системы свойств, чтобы установить его, а не использовать оболочку свойств и ее сеттер.
...
Поскольку текущая реализация WPF поведения процессора XAML для настройки свойств полностью обходит оболочки, вы не должны вводить какую-либо дополнительную логику в определения множества обертки для вашего пользовательского свойства зависимостей. Если вы установите такую логику в определение набора, тогда логика не будет выполняться, если свойство задано в XAML, а не в коде.
blockquote>Ваш код должен выглядеть так:
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); }
Теперь я нашел ответ. 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
. Спасибо за помощь, ребята!