Вам даже не нужен INotifyPropertyChanged для этого примера.Я не совсем уверен в том, чего вы пытаетесь достичь, но этот код даст то, что я почерпнул из вашего поста.
<Window x:Class="RaisePropertyChangedExample.BindingExample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Correct View" Width="150" Height="80">
<StackPanel Orientation="Vertical">
<ComboBox ItemsSource="{Binding Items}"
x:Name="ItemViews"
HorizontalAlignment="Stretch" VerticalAlignment="Center" DisplayMemberPath="Name"/>
<TextBox DataContext="{Binding SelectedItem, ElementName=ItemViews}" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
</StackPanel>
</Window>
и вспомогательный код
using System.Windows;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace RaisePropertyChangedExample
{
public partial class BindingExample : Window
{
public BindingExample()
{
InitializeComponent();
DataContext = new BindingExampleViewModel();
}
}
public class BindingExampleViewModel
{
public ObservableCollection<TestItemViewModel> Items { get; set; }
= new ObservableCollection<TestItemViewModel>(new List<TestItemViewModel>
{
new TestItemViewModel {Name = "Test1"},
new TestItemViewModel {Name = "Test2"}
});
}
public class TestItemViewModel
{
public string Name { get; set; }
}
}
Если толькосуществует некоторая потребность в index
из выбранных Item
, нет никаких реальных аргументов против простого представления каждого элемента в качестве модели представления TestItemViewModel
и привязки других элементов управления непосредственно к самому выбранному элементу.Однако если другие элементы управления привязаны к элементам TestItemViewModel
, то все равно не обязательно, что вам следует реализовать INotifyPropertyChanged в этой модели представления.
В следующем примере по-прежнему будет отображаться правильная информация при подключении к существующей ViewModel:
<Window x:Class="RaisePropertyChangedExample.BindingExample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Correct View" Width="150" Height="100">
<StackPanel Orientation="Vertical">
<ComboBox ItemsSource="{Binding Items}"
x:Name="Combo"
HorizontalAlignment="Stretch" VerticalAlignment="Center" DisplayMemberPath="Name"/>
<Grid DataContext="{Binding SelectedItem, ElementName=Combo}">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<Label Grid.Row="1" HorizontalAlignment="Stretch" Height="20" Content="{Binding Name}" />
</Grid>
</StackPanel>
</Window>
Обычно
Обновление после каждого нажатия клавиши можетснижает производительность и лишает пользователя обычной возможности вернуться на задний план и исправить ошибки ввода перед принятием нового значения . см. Справочник MS
, однако, это проблема только в том случае, если в результате обновления источника происходит другая обработка.Если вас беспокоит объем обработки, вы можете переключиться на стандартное поведение LostFocus
, просто пропустив объявление UpdateSourceTrigger.