DependencyProperty bool в UserControl

#c# #wpf #user-controls #dependency-properties

#c# #wpf #пользовательские элементы управления #зависимость-свойства

Вопрос:

У меня проблема со свойством DependencyProperty в UserControl. Мой элемент управления предоставляет два Dependencyproperties, bool и string. Свойство string работает, а bool — нет. Я не получаю ошибок, но изменения в любом случае не отражаются.

Я определяю свойство следующим образом:

 private static readonly DependencyProperty IncludeSubdirectoriesProperty =
    DependencyProperty.Register(
        "IncludeSubdirectories",
        typeof(bool),
        typeof(DirectorySelect),
        new FrameworkPropertyMetadata(false) { BindsTwoWayByDefault = true }
        );

public bool IncludeSubdirectories
{
    get { return (bool) GetValue(IncludeSubdirectoriesProperty); }
    set { SetValue(IncludeSubdirectoriesProperty, value); }
}
  

В XAML для пользовательского элемента управления я привязываюсь к свойству следующим образом:

 <CheckBox
    Name="IncludeSubdirectoriesCheckbox"
    IsChecked="{Binding Path=IncludeSubdirectories, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    Include subfolders</CheckBox>
  

И когда я использую элемент управления, я привязываюсь к свойствам, подобным этому:

 <Controls:DirectorySelect
    Directory="{Binding Directory}"
    IncludeSubdirectories="{Binding WatchSubDirs}"/>
  

«Directory» — это строковое свойство, которое работает просто отлично. Я привязываюсь к ним обоим одинаково, но я просто не могу заставить bool работать.

Где я ошибся?

Комментарии:

1. Как вы видите, что изменения не отражены?? Вы пробовали устанавливать точки останова в самом WatchSubDirs не IncludeSubdirectoriesProperty ? Является WatchSubDirs DP или простым свойством?

2. VS не выдает сигнал во время компиляции, но печатает информацию журнала в окне вывода Visual Studio. Там всегда что-то написано. Среди всего прочего вы должны найти ошибку при неудачной привязке, неудачном преобразовании или чем-то еще…

3. Я не знал о сообщениях о состоянии в окне вывода. Это очень помогает 🙂 Спасибо.

Ответ №1:

Вы могли бы попробовать изменить привязку с помощью вашего пользовательского элемента управления к привязке элемента. Прежде чем вы это сделаете, обязательно укажите вашему UserControl имя.

Затем измените:

      IsChecked="{Binding Path=IncludeSubdirectories, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  

К чему-то вроде этого:

      IsChecked="{Binding Path=IncludeSubdirectories, ElementName="<UserControlName>", Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  

Еще одна проверка работоспособности, которую вы можете выполнить, — убедиться, что тип owner для IncludeSubdirectoriesProperty’ указан правильно.

Комментарии:

1. Это сделало это. Проблема заключалась в том, что флажок в моем usercontrol был привязан к datacontext в окне, где я использовал свой элемент управления, а не к его собственным свойствам. Неправильный datacontext имел свойство с тем же именем, что и в моем usercontrol (Каталог), поэтому привязка случайно сработала с этим свойством, но не включала подкаталоги. Спасибо за помощь.

Ответ №2:

попробуйте это, чтобы выяснить, что идет не так

 private static readonly DependencyProperty IncludeSubdirectoriesProperty =
    DependencyProperty.Register(
        "IncludeSubdirectories",
        typeof(bool),
        typeof(DirectorySelect),
        new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIncludeSubdirectoriesPropertyChanged)) { BindsTwoWayByDefault = true }
        );

privatestaticvoid OnIncludeSubdirectoriesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
  // make a breakpoint here
}
  

отладочные привязки

 <CheckBox Name="IncludeSubdirectoriesCheckbox"
          IsChecked="{Binding Path=IncludeSubdirectories, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, diagnostics:PresentationTraceSources.TraceLevel=High}">Include subfolders</CheckBox>
  

и

 <Controls:DirectorySelect Directory="{Binding Directory}" IncludeSubdirectories="{Binding WatchSubDirs, diagnostics:PresentationTraceSources.TraceLevel=High}"/>
  

вы должны включить

 <Window xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" />
  

также измените настройки трассировки WPF в Tools-> Options-> Debugging-> Окно вывода
для привязки к данным = предупреждение

теперь посмотрите на окно вывода, что происходит

надеюсь, это поможет