none
Можно ли определить и использовать триггеры в XAML-разметке WPF-окна для изменения переменной-члена этого окна? RRS feed

  • Вопрос

  • Добрый день.

    В главном окне WPF-приложения есть привязанный TextBox.

    <TextBox Name="tbxRange" Grid.Row="1" Grid.Column="3" TextAlignment="Center"
             Text="{Binding Path=CurCompassRange.Range, UpdateSourceTrigger=PropertyChanged,
             Mode=OneWayToSource, RelativeSource={RelativeSource AncestorType={x:Type Window}}
             }"/>

    Значение CurCompassRange.Range, к которому привязан TextBox, это значение типа Double, которое является полем в классе. CurCompassRange - это открытое свойство для доступа к экземпляру данного класса. Класс этот (определение здесь не привожу) реализует INitifyPropertyChanged. Затем. В классе главного окна определён ещё один член.

    private MyType _myValue = new MyType();

    На его основе определено открытое свойство, которое тоже используется в привязке (положим, к нему привязан другой TextBox): Вот определение класса MyType:

    public class MyType : INotifyPropertyChanged
    {
        #region Events
    
        /// <summary>
        /// Событие "Изменилось значение свойства"
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    
        #region Fields
    
        /// <summary>
        /// Текущее значение.
        /// </summary>
        private Double currentValue;
            
        #endregion
    
        #region PropertyChanged Event Raiser
    
        /// <summary>
        ///  Вызывает событие "Изменилось значение свойства".
        /// </summary>
        /// <param name="propertyName"></param>
        private void NotifyPropertyChanged(String propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        #endregion
    
        #region Properties
    
        /// <summary>
        /// Возвращает или задаёт текущее значение.
        /// </summary>
        public Double CurrentValue
        {
            get { return currentValue; }
            set
            {
                if (currentValue != value)
                {
                    currentValue = value;
                    NotifyPropertyChanged("CurrentValue");
                }
            }
        }
            
            #endregion
    }

    Мне нужно, что бы при изменении значения с-ва Text у текстбокса tbxRange, изменившееся (в связи с этим) значение его привязки CurCompassRange.Range автоматически вычиталось из значения _myValue.CurrentValue и результат автоматом записывался бы в третью пременную типа Double (скажем private Double myVar;), тоже являющуюся членом класса главного окна. Теперь сам вопрос: Можно ли это сделать (задать) средствами XAML в разметке главного окна приложения, не прибегая при этом к  C# code behind? Например, с помощью определения каких-нибудь триггеров в разметке? Извините, что вопрос может быть и несуразный. Но что поделать. Обработчик TextInput у текстбокса почему-то не внушает большого доверия, хотя может быть я и не прав.

    22 февраля 2013 г. 11:36

Ответы

  • Ну с помощью каких нибудь триггеров такие задачи точно не решаются, а и без них решать это только с помощью XAML не стоит. Если у вас не вызывает доверия TextInput, то не проще ли в методе Set свойства CurCompassRange.Range и делать ети вычесления с присвоением результата нужной переменной. Соответственно каждый раз, когда CurCompassRange.Range будет менятся, будет производится расчет и не нужно дополнительных обработчиков событий и усложнений кода.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа TownSparrow 25 февраля 2013 г. 8:31
    22 февраля 2013 г. 11:49
    Отвечающий

Все ответы

  • Ну с помощью каких нибудь триггеров такие задачи точно не решаются, а и без них решать это только с помощью XAML не стоит. Если у вас не вызывает доверия TextInput, то не проще ли в методе Set свойства CurCompassRange.Range и делать ети вычесления с присвоением результата нужной переменной. Соответственно каждый раз, когда CurCompassRange.Range будет менятся, будет производится расчет и не нужно дополнительных обработчиков событий и усложнений кода.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа TownSparrow 25 февраля 2013 г. 8:31
    22 февраля 2013 г. 11:49
    Отвечающий
  • Хорошо. Я сделал с помощью обработчика события TextBox.TextChanged.

    25 февраля 2013 г. 8:30