2011-11-09 2 views
3

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

Я определяю свойство как это:

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}"/> 

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

Где я ошибся?

+1

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

+0

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

+0

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

ответ

3

Вы можете попробовать привязать привязку с вашим пользовательским элементом управления привязкой к элементу. Прежде чем вы обязательно укажете имя пользователя userControl.

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

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

Чтобы что-то вроде этого:

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

Другой здравомыслие проверки вы можете выполнить, чтобы убедиться, что владелец типа для IncludeSubdirectoriesProperty»является правильным.

+0

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

1

попробовать это, чтобы выяснить, что происходит неправильно

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-> Output Window для привязки данных = Предупреждение

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

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

Смежные вопросы