Возьмите под свой контроль, у которого есть привязка с надписью ="{Binding SelectedMovie.Vu, ...}"
.
Помните, что Binding - это просто отражение в объекте экземпляра того, что определено, что должно перейти к SelectedMovie.Vu
.
Свойство SelectedMovie
установлено как приватное, и отражение в нем тут же не выполняется (проблема № 1).
Так что давайте сделаем SelectedMovie
общедоступным.Это все еще не удается!Даже когда выбор изменяется, привязка не получает данные current .Почему?
Почему, когда элемент управления помещается на экран, он пытается выполнить привязку в то время , свойство которого равно Null
.Таким образом, он ничего не показывает.
Когда свойство изменяется, привязка все еще не выполняется, поскольку не получает событие для изменения , поэтому оно может заменить нулевое значение.
Почему?
Свойство не следует INotifyPropertyChanged
, поэтому нет события объявляет, что было внесено изменение, поскольку привязка элемента управления будет прослушивать событие изменения для SelectedMovie
, но SelectedMovie
никогда не объявляет об изменении.
Но возможна третья проблема даже после того, как SelectedMovie
сообщает об изменении с помощью INotifyPropertyChanged
.Поскольку привязка ищет уведомление о фактическом изменении child от .Vu
.
.Vu
не объявляет об изменении, потому что оно также не делает InotifyPropertyChanged
.Даже если это так ... он не объявляет об изменении, когда установлено SelectedMovie
.Откуда он это знает?
Вы можете заставить вашу систему привязки работать, но вам придется делать некоторые дополнительные события уведомления, когда установлен объект верхнего уровня.Вам следует использовать привязку к самому имени DataGrid
.Вот пример использования аналогичного ListBox
:
Пример В нашем Window
или Page
или Control
я собираюсь настроить некоторые данные в XAML для нашего примера.
Данные
<Window.Resources>
<model:Orders x:Key="Orders">
<model:Order CustomerName="Alpha"
OrderId="997"
InProgress="True" />
<model:Order CustomerName="Beta"
OrderId="998"
InProgress="False" />
<model:Order CustomerName="Omega"
OrderId="999"
InProgress="True" />
<model:Order CustomerName="Zeta"
OrderId="1000"
InProgress="False" />
</model:Orders>
</Window.Resources>
ListBox
Затем я собираюсь разместить / связать данные в ListBox
в которой каждая строка будет TextBox
для отображения CustomerName
.
<ListBox ItemsSource="{StaticResource Orders}" x:Name="lbOrders">
<ListBox.Resources>
<DataTemplate DataType="{x:Type model:Order}">
<TextBlock Text="{Binding Path=CustomerName}" />
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=InProgress}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Resources>
</ListBox>
Итак, у нас есть список, в котором отображаются данные:
Показать номер заказа выбранного элемента
Так что теперь мы добавим еще один элемент управления, который будет отображать номер заказа выбранного элемента пользователя.Мы будем связывать, используя ElementName
, который будет указывать на свойство зависимостей SelectedItem
нашего элемента управления listbox с именем элемента управления, которое мы дали, которое является lbOrders
.В этом свойстве оно будет содержать выбранный экземпляр, и мы опустимся до OrderId
.
<Label Content="{Binding SelectedItem.OrderId, ElementName=lbOrders}"/>
Так что, когда мы выбираем Omega
, мы получаем «999».