#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-> Окно вывода
для привязки к данным = предупреждение
теперь посмотрите на окно вывода, что происходит
надеюсь, это поможет