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>

 

 

posted @ 2025-04-16 10:22  灰色淡季  阅读(38)  评论(0)    收藏  举报