Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
course_(Windows&Web).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.68 Mб
Скачать

Улучшенная поддержка шаблона mvvm

Данная поддержка состоит в расширении перечислимого типа UpdateSourceTrigger значением PropertyChanged. Данное значение влияет на обновление источника данных, происходящее при обновлении цели (элемента, куда данные выгружаются). Ранее этот тип поддерживал лишь два значения, это LostFocus и Explicit. Иными словами, если Вы связываете данные с элементом управления TextBox, то в случае двунаправленного связывания, при изменении элемента TextBox, источник мог быть обновлен лишь при потере фокуса или явным образом. Значение PropertyChanged позволяет реагировать на любые изменения в текстовом поле «на лету». При этом нет необходимости обрабатывать нажатия клавиш и т .д. Вот пример кода:

1: <UserControl x:Class="SilverlightApplication1.MainPage" 2: xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation 3: xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml 4: xmlns:d=http://schemas.microsoft.com/expression/blend/2008 5: xmlns:mc=http://schemas.openxmlformats.org/markup-ompatibility/2006 6: Loaded="UserControl_Loaded" 7: mc:Ignorable="d" 8: d:DesignHeight="300" d:DesignWidth="400"> 9:   10: <Grid x:Name="LayoutRoot" Background="White"> 11: <Grid.Resources> 12: <Style TargetType="TextBox"> 13: <Setter Property="Background" Value="AliceBlue"/> 14: <Setter Property="Width" Value="200"/> 15: <Setter Property="Margin" Value="5"/> 16: </Style> 17: <Style TargetType="TextBlock"> 18: <Setter Property="Margin" Value="5"/> 19: </Style> 20: </Grid.Resources> 21: <Grid.RowDefinitions> 22: <RowDefinition Height="Auto"></RowDefinition> 23: <RowDefinition Height="Auto"></RowDefinition> 24: </Grid.RowDefinitions> 25: <Grid.ColumnDefinitions> 26: <ColumnDefinition Width="Auto"></ColumnDefinition> 27: <ColumnDefinition Width="Auto"></ColumnDefinition> 28: </Grid.ColumnDefinitions> 29:   30: <TextBlock Text="First Name:" Grid.Column="0" Grid.Row="0"/> 31: <TextBox Grid.Row="0" Grid.Column="1" Text= 32: "{Binding FirstName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 33: </TextBox> 34: <TextBlock Text="Your First Name:" Grid.Column="0" Grid.Row="1"/> 35: <TextBlock Text="{Binding FirstName}" Grid.Column="1" Grid.Row="1"/ > 36:   37: </Grid> 38: </UserControl>

Ну и код модифицированного класса (чтобы работало связывание в двух направлениях):

1: public class Person: INotifyPropertyChanged 2: { 3: public string firstName; 4:   5: public string FirstName { 6: get { return firstName; } 7: set { 8: firstName = value; 9: OnPropertyChanged(new PropertyChangedEventArgs("FirstName")); 10: } 11: } 12:   13: public event PropertyChangedEventHandler PropertyChanged; 14:   15: public void OnPropertyChanged(PropertyChangedEventArgs e) 16: { 17: if (PropertyChanged != null) 18: PropertyChanged(this, e); 19: } 20:   21: }

В результате, если вводить текст в поле редактирования, он тут же будет отображаться и в поле ниже. Это не всегда хорошо, так как если текст проходит валидацию, то в процессе набора нет необходимости требовать его корректность, но иногда такая возможность может быть полезна.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]