Что именно требуется для этой привязки WPF для обновления?

1

У меня есть treeview, к которому я добавил поведение, которое позволяет мне привязываться к выбранному в данный момент элементу (свойство зависимости, которое я назвал SelectedCourse). Это работает очень хорошо, так как я могу приостановить программу и подтвердить, что значение выбранного элемента меняется:

Изображение 174551

Вот привязка XAML:

<TextBox TextWrapping="Wrap"
         Text="{Binding SelectedCourse.Description}">
</TextBox>

И, как вы видите, ничего не происходит в пользовательском интерфейсе, когда SelectedCourse обновляется:

(Красным полем справа является текстовое поле. Красный контур происходит от Snoop.)

Изображение 174551

BindableCourse наследует от DependencyObject, а описание - свойство зависимостей:

public class BindableCourse : DependencyObject
{
    public static DependencyProperty DescriptionProperty = DependencyProperty.Register(
            "Description",
            typeof(string),
            typeof(BindableCourse));

    public string Description
    {
        get { return (string)GetValue(DescriptionProperty); }
        set { SetValue(DescriptionProperty, value); }
    }
}

Теперь, если я посмотрю элемент текстового поля в Snoop, SelectedCourse.Description появится в текстовом поле по желанию.

Изображение 174551Изображение 174551

После этого я не могу изменить текстовое поле; даже с помощью, например, изменения SelectedCourse - и я проверил, и SelectedCourse меняет, когда я выбираю новый элемент, а затем закрываю Snoop, повторно открывая его и затем пересматривая текстовое поле.

wtf продолжается?

  • 1
    TextBox.Text связывает два пути по умолчанию, поэтому возможно, что описание выбранного курса изменяется. Попробуйте добавить Mode=OneWay к вашей привязке и посмотрите, Mode=OneWay ли это какое-либо влияние. Предполагая, что вы не хотите, чтобы пользователь мог изменять описание, вы также должны установить IsReadOnly="True" в TextBox .
Теги:
wpf
data-binding
heisenbug

1 ответ

1
Лучший ответ

Вместо использования собственного пользовательского связывания, я думаю, вы можете сделать что-то вроде следующего:

<TextBox TextWrapping="Wrap"
     Text="{Binding ElementName=TreeViewName, Path=SelectedValue.Description}">
</TextBox>

Выбранное значение изменится в зависимости от выбора дерева. "TreeViewName" - это имя вашего дерева, используя атрибут x: Name.

  • 0
    Блин, что сработало? Я прочитал другой поток на SO, говоря, что Binding to SelectedItem не работает с TreeViews, поэтому я даже не пытался. Спасибо за вашу помощь.
  • 1
    Это другой стиль привязки, который не включает ViewModel. Он привязывается к конкретному элементу управления в вашем представлении через свойство ElementName. Выбранное значение будет привязано к элементу данных, который в данный момент выбран в TreeView.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню