2016-11-02 2 views
0

У меня есть UserControl с 2 пользовательских DependencyProperty s (ColumnsCount, RowsCount):привязки данных с пользовательского Dependency-свойство UserControl не работает

public partial class CabinetGrid : UserControl 
{ 

    public static readonly DependencyProperty ColumnsCountProperty = 
     DependencyProperty.Register("ColumnsCount", typeof (int), typeof (CabinetGrid)); 

    public static readonly DependencyProperty RowsCountProperty = 
     DependencyProperty.Register("RowsCount", typeof (int), typeof (CabinetGrid)); 

    public int ColumnsCount 
    { 
     get { return (int) GetValue(ColumnsCountProperty); } 
     set { SetValue(ColumnsCountProperty, value); } 
    } 
    public int RowsCount 
    { 
     get { return (int) GetValue(RowsCountProperty); } 
     set { SetValue(RowsCountProperty, value); } 
    } 
} 

И вот DataBinding:

<view:CabinetGrid Grid.Column="1" Grid.Row="2" x:Name="GridRack" ColumnsCount="{Binding SelectedRoom.ColumnCount}" /> 

тогда как окно DataContext имеет свойство SelectedRoom, которое вызывает PropertyChanged-Event.
С помощью отладки, я узнал, что DataContextUserControl установлен правильно.

Однако, когда SelectedRoom изменился (=> Я выбрал другой элемент в списке), в DependencyPropertyColumnsCount из моего UserControl не обновляется. Я очень расстроен, так как я уже провел целый день, отлаживая это неожиданное дерьмо, используя такие инструменты, как XAMLSpy и WpfSpoon.
Пожалуйста, помогите.


EDIT:
Clemens уже указывал, что точка останова в CLR-Property обертывание DependencyProperty (ColumnsCount) является не уволен. Это серьезная проблема, так как я должен вызвать некоторые методы изменения. Я пытаюсь использовать PropertyChangedCallback, но в настоящее время я испытываю некоторые ошибки.

+0

thx но он тоже не работает. – ANewQuestionnaire

+0

«Столбцы моего UserControl не обновляются». Как именно вы это проверяете? Разве вы ничего не видите или просто не изменили значения? Существует ли механизм уведомления об изменении свойств для исходного свойства (т. Е. 'SelectedRoom')? – Clemens

+0

@Clemens Конечно, 'SelectedRoom' ofc вызывает событие PropertyChanged. Я также создал 'DataBinding' для' SelectedRoom' в другом 'UserControl', и я могу привязываться к любому свойству' SelectedRoom' должным образом (он обновляется) – ANewQuestionnaire

ответ

1

Чтобы получить уведомление об изменении стоимости свойства зависимости, вы должны указать PropertyChangedCallback в PropertyMetadata при регистрации свойства.

public static readonly DependencyProperty ColumnsCountProperty = 
    DependencyProperty.Register(
     "ColumnsCount", typeof(int), typeof(CabinetGrid), 
     new PropertyMetadata(OnColumnsCountPropertyChanged)); 

private static void OnColumnsCountPropertyChanged(
    DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    var cabinetGrid = (CabinetGrid)obj; 

    // do something with the CabinetGrid instance 
} 
+0

Обратный вызов, конечно, поднятие события, нет. В измененном обратном вызове получите контекст datagrid и обновите его. Тогда вы должны оказаться в сеттере, верно? (просто вслух) –

+1

@TomVanSchaijk Обратный вызов будет необходим только в том случае, если будет что-то делать. Мы не знаем, что это может быть внутренняя привязка. И «получить контекст datagrid и обновить свойство там» тоже не так. Обычно вы не работаете непосредственно с DataContext. Для этого нужны привязки. – Clemens

+0

Правда, правда, я стою с исправлением сэр;) –

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