Пользовательский UserControl "IsEnabled" привязка данных не работает - PullRequest
4 голосов
/ 17 марта 2011

У меня сейчас какая-то ужасная проблема с моим приложением WPF ...

У меня есть пользовательский элемент управления UserControl, используемый для редактирования деталей компонента.Он должен начинаться с неактивности и становиться включенным, как только пользователь выберет компонент для редактирования.

Проблема в том, что свойство IsEnabled даже не меняется.

Вот мой код:

<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  
                        IsEnabled="{Binding EditorEnabled}"
                              DataContext="{Binding VmComponent}" />

EditorEnabled является свойством в моей ViewModel (VmComponent) и по умолчанию имеет значение false, становится истинным, когда пользователь выбрал компонент или создал его

Только для записи, вмоя ViewModel:

private Boolean _editorEnabled = false;

    public Boolean EditorEnabled
    {
        get { return _editorEnabled; }
        set 
        {
            _editorEnabled = value;
            OnPropertyChanged("EditorEnabled");
        }
    }

Когда я пытаюсь запустить свое приложение, UserControl запускается ... включен.Я везде добавлял точки останова, EditorEnabled с самого начала ложен.

Я также сделал ужасную глупость, чтобы попытаться выяснить, что происходит: я создал конвертер (настолько полезный - преобразование логического значения в логическое -эх), установите для него точку останова и ... код никогда не достигается.

<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  
                        IsEnabled="{Binding EditorEnabled, Converter={StaticResource BoolConverter}}"
                              DataContext="{Binding VmComponent}" />

Это, вероятно, означает, что свойство isEnabled никогда не устанавливается, поскольку конвертер никогда не достигается.

Видите ли вы какие-либо проблемы там?Я начал работать в WPF около недели назад, и, возможно, я упустил что-то важное ...

Большое спасибо за ваше время: -)

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

Вы должны добавить DependencyProperty для правильной работы привязки. Смотрите здесь для получения дополнительной информации.

Кодовый код:

public static readonly DependencyProperty EditorEnabledDependencyProperty = DependencyProperty.Register("EditorEnabled", typeof(bool), typeof(UcComponentEditor), new PropertyMetadata(false));

public bool EditorEnabled
{
    get { return (bool)base.GetValue(UcComponentEditor.EditorEnabledDependencyProperty); }
    set { base.SetValue(UcComponentEditor.EditorEnabledDependencyProperty, value); }
}
1 голос
/ 25 августа 2012

Я думаю, что проблема заключается в том, что существует привязка к свойству DataContext пользовательского элемента управления. Это означает, что свойство EditorEnabled должно быть свойством в объекте VmComponent. По крайней мере, такова была моя проблема.

Чтобы обойти это, я указал правильный источник для привязки IsEnabled. Как только я это сделал, элемент управления начал работать как положено.

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

0 голосов
/ 25 февраля 2014

Инкапсуляция вашего элемента управления в DockPanel (например) устранит необходимость в DependencyProperty.

Затем вы можете просто выполнить связывание с панелью док-станции вместо пользовательского элемента управления.Установка переменной, привязанной к IsEnabled на панели Dock, автоматически включит или отключит элементы, содержащиеся в Dockpanel.

...