2.WPF绑定
1.本示例列举了单项绑定,双向绑定,集合绑定,静态资源绑定的示例
MainWindow.xaml.cs
using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; namespace WpfBindingExample { /// <summary> /// 集合绑定类 /// </summary> public class Person { public string NameItems { get; set; } } /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window, INotifyPropertyChanged { string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged("Name"); } } //被绑定的集合 public ObservableCollection<Person> People { get; set; } public MainWindow() { InitializeComponent(); People = new ObservableCollection<Person> { new Person { NameItems = "John" }, new Person { NameItems = "Jane" }, new Person { NameItems = "Bob" } }; DataContext = this; } //属性改变事件,通知绑定对象Name属性改变 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
MainWindow.xaml
<Window x:Class="WpfBindingExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfBindingExample" xmlns:sys="clr-namespace:System;assembly=mscorlib" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <!--待绑定的静态资源--> <Window.Resources> <sys:String x:Key="MyText">Hello, WPF!</sys:String> </Window.Resources> <Grid> <GroupBox Header="双向绑定" Margin="0,22,454,343"> <Canvas Margin="0,0,-2,0" > <!--双向绑定MainWindow类下面的属性Name,UpdateSourceTrigger=PropertyChanged:指定更新数据源的时机为 “当控件属性值发生变化时”(即用户输入时每改变一个字符,就立即更新数据源)。--> <TextBox x:Name="txtName" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="43" Canvas.Left="10" Width="86" /> <!--默认单项绑定Name--> <Label Content="{Binding Name}" Width="60" Height="30" RenderTransformOrigin="0.512,0.323" Canvas.Left="395" Canvas.Top="13" /> </Canvas> </GroupBox> <GroupBox Header="集合绑定" Margin="10,112,600,218" > <Canvas> <!--集合绑定MainWindow类下面的属性People--> <ListBox ItemsSource="{Binding People}" DisplayMemberPath="NameItems" /> </Canvas> </GroupBox> <GroupBox Header="静态资源" Margin="10,200,566,159" > <Canvas> <!--静态资源绑定--> <TextBlock Text="{StaticResource MyText}" /> </Canvas> </GroupBox> <!-- 命令绑定 --> </Grid> </Window>
2.下面展示命令绑定,和多绑定示例。
2.1创建一个命令 属性,将命令赋值为自定义命令,并且传入一个方法,当这个命令触发时,会执行被传入的方法
2.2 多绑定MultiBinding获取属性类的多个值
界面的cs代码
using System; using System.Windows; using System.Windows.Input; namespace AdvancedBinding { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new ViewModel(); } } public class ViewModel { //被多绑定的类 public Person SinglePerson { get; set; } //被绑定的命令 public ICommand MyCommand { get; set; } public ViewModel() { SinglePerson = new Person { FirstName = "John", LastName = "Doe", Name = "John Doe" }; MyCommand = new RelayCommand(ExecuteMyCommand);//创建自定义命令绑定方法进去 } private void ExecuteMyCommand(object parameter) { MessageBox.Show("Command executed!"); } } public class Person { public string FirstName { get; set; } public string LastName { get; set; } public string Name { get; set; } } /// <summary> /// 自定义命令类(实现 ICommand 接口) /// </summary> public class RelayCommand : ICommand { private readonly Action<object> _execute; private readonly Predicate<object> _canExecute; public RelayCommand(Action<object> execute) : this(execute, null) { } public RelayCommand(Action<object> execute, Predicate<object> canExecute) { _execute = execute; _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute == null || _canExecute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { _execute(parameter); } } }
界面XAML代码
<Window x:Class="AdvancedBinding.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:AdvancedBinding" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- 命令绑定 --> <GroupBox Header="Command Binding" HorizontalAlignment="Left" Height="100" Margin="10,330,0,0" VerticalAlignment="Top" Width="200"> <Button Content="Click Me" Command="{Binding MyCommand}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75"/> </GroupBox> <!-- 多绑定 --> <GroupBox Header="Multi Binding" HorizontalAlignment="Left" Height="100" Margin="220,10,0,0" VerticalAlignment="Top" Width="200"> <TextBox> <TextBox.Text> <MultiBinding StringFormat="{}{0}-{1}"> <Binding Path="SinglePerson.FirstName"/> <Binding Path="SinglePerson.LastName"/> </MultiBinding> </TextBox.Text> </TextBox> </GroupBox> </Grid> </Window>
浙公网安备 33010602011771号