OnPropertyChange проблема - PullRequest
       5

OnPropertyChange проблема

0 голосов
/ 20 ноября 2018

снова мне нужна твоя помощь.У меня 3 WPF UserControl.2-й использует 1-й в качестве шаблона, а 3-й использует 2-й.

, в первом у меня есть флажок.Моя цель - вызывать метод в 3-м элементе UserControl всякий раз, когда установлен флажок в первом элементе UserControl.

Я передаю значение из флажка через 3 элемента UserControls следующим образом:

public bool IsCameraChecked
      {
         get { return (bool)GetValue(IsCameraCheckedProperty); }
         set { SetValue(IsCameraCheckedProperty, value); }          
      }

public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(ReplayController), new PropertyMetadata(false));

и в XAML я делаю это для флажка в первом UserControl:

<CheckBox x:Name="ckbCamera" Grid.Column="2" Grid.Row="1" Click="ckbActiv_Clicked" Margin="10,8,-10,6" IsChecked="{Binding ElementName=_this,Path=IsCameraChecked, Mode=TwoWay}"/>

и повторяю то же самое для второго и третьего UserControl.

пока все работает так, как должно бытьесли я вызываю / ckeck bool IsCamerChecked из третьего UserControl, он дает мне точное значение флажка (true или false)

Проблема в том, что теперь я не могу ее получитьработать с OnProperty изменить.Я хочу вызывать метод из 3-го UserControl всегда, когда IsCameraChecked равен true .

это то, что я делал в последнем 3-м UserControl:

 public bool IsCameraChecked
      {
         get { return (bool)GetValue(IsCameraCheckedProperty); }
         set
         {
            SetValue(IsCameraCheckedProperty, value);
            _isConnected = value;                
            OnPropertyChanged();
         }
      }
      /// <summary>
      /// Called when any property changes.
      /// </summary>
      public event EventHandler PropertyChanged;

      protected void OnPropertyChanged()
      {
         EventHandler handler = PropertyChanged;
         if (handler != null)
            handler(this, EventArgs.Empty);
      }      
public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(TWDebugRecorder), new PropertyMetadata(false));

к сожалению, значение IsCameraChecked проверяется только, если я вызываю его напрямую из любого метода, но мне нужно, чтобы при проверке chekcbox в 1-м UserControl значение IsCameraChecked в третьем UserControl становятся true и уведомлением, если это значение изменяется.Я надеюсь, вы поняли, что я имею в виду.Заранее спасибо:)

ОБНОВЛЕНИЕ Найдено решение: в 3-м UserControl я изменил код на:

public bool IsCameraChecked
      {
         get { return (bool)GetValue(IsCameraCheckedProperty); }
         set
         {
            SetValue(IsCameraCheckedProperty, value);
            _isConnected = value;
         }
      }          

      protected static void OnPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
      {
         TWDebugRecorder temp = source as TWDebugRecorder;

         // here comes my method I wanted to call

      }     

public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(TWDebugRecorder), new PropertyMetadata(false, OnPropertyChanged));

1 Ответ

0 голосов
/ 20 ноября 2018

Я рад, что вы сами нашли, что вам нужно работать с PropertyChangedCallback.Вы не должны использовать логику в установщике или получателе DependencyProperty, потому что они будут вызываться только программно из кода позади, XAML работает напрямую с SetValue (..).Поэтому вы должны использовать PropertyChangedCallback в 3. UserControl и перемещать логику из Property-Setter:

public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(TWDebugRecorder), new PropertyMetadata(false, CameraCheckedChanged));

private static void CameraCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    _isConnected = value;
    OnPropertyChanged();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...