WPF 控件/元素绑定

1.Slider和TextBlock之间进行绑定(Xaml文本的操作)

  • ElementName=Slider1:(元素)对象的名称是Slider1
  • Path=Value :Slider1下面的属性的是Value
  • Mode下面有4个模式
    • TwoWay(defualt):
      ->代表双向绑定
    • OneWay:代表被绑定的对象改变引起主动绑定的对象改变
      如果如下代码,TextBox的Text绑定了Slider1的Value的时候,
      ->如果Slider1的Value变化,那么TextBox的Text变化
      ->如果TextBox的Text变化, Slider1的Value不会变化
    • OneTime:代表绑定只会执行一次,不会一直监听
      ->代表如果绑定只执行一次,下图代码会在初始化阶段执行
    • OneWayToSource: 代表主动绑定的对象改变引起被绑定的对象改变
      如果如下代码,TextBox的Text绑定了Slider1的Value的时候,
      ->如果Slider1的Value变化,那么TextBox的Text不会变化
      ->如果TextBox的Text变化, Slider1的Value变化
<Slider x:Name="Slider1" Maximum="100" Minimum="1" Grid.Row="0" VerticalAlignment="Center" TickPlacement="TopLeft" TickFrequency="2" Margin="10" />
<TextBlock x:Name="TextBlock1" Grid.Row="1"  FontSize="{Binding ElementName=Slider1, Path=Value, Mode=TwoWay}" Text="1"  TextAlignment="Center"/>
<TextBox x:Name="TextBox1" Grid.Row="2" Width="300" Height="50" Text="{Binding ElementName=Slider1, Path=Value, Mode=Default, UpdateSourceTrigger=PropertyChanged}" />

2.Slider和TextBlock之间进行绑定(后台代码操作)

<!--xaml代码-->
<TextBox x:Name="TextFontFamily" Grid.Row="5" Text=""/>
<TextBlock Grid.Row="6" Text="数据绑定" FontFamily="{Binding Source={StaticResource fontContent}, Path=Source}"/>

绑定

//实例化绑定,构造函数中的参数代表设置目标的属性
Binding binding = new Binding("Text");
//设置想要绑定的对象
binding.ElementName = "TextBox1";
//设置在Label1的Content属性上绑定TextBox1.Text
BindingOperations.SetBinding(Label1, System.Windows.Controls.Label.ContentProperty, binding);
//将Label1上的Content属性解绑
BindingOperations.ClearBinding(Label1, System.Windows.Controls.Label.ContentProperty);
//将Label1上的所有属性解绑
BindingOperations.ClearAllBindings(Label1);

3.属性和控件之间的绑定

  • Wpf规定,如果Binding如果只指定了path,没有指定source,那么就会将控件的DataContext用来当作source

代码如下

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowsViewModel();
        }
    }

控件代码如下

<TextBox x:Name="text_1" Grid.Row="1" FontSize="50" Text="{Binding Path = Text1}"/>
  • 属性代码如下需要注意的是当使用binding绑定了数据之后,例如textbox
    • 如果在控件上修改值,那么会导致属性的值发生改变
    • 但是如果属性值发生改变,和控件绑定不一样的是,必须使用INotifyPropertyChanged接口的PropertyChangedEventHandler事件处理器,将其激并且将相应的做出改变的属性名称传出
 internal class MainWindowsViewModel:NotifacationObject	{	
      private double _text1;
	  public double Text1
	{
	   get { return _text1; }
	   set {
		_text1 = value;
		this.RaisePropertyChanged("Text1");
	       }
	}
}

4.命令和控件之间的绑定

  • 首先控件是通过是同Command这个属性来绑定命令的(此处跟3一样,Source使用的是MainWindowsViewModel的实例)
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowsViewModel();
        }
    }
<Button Content="Test" Command="{Binding Path=TestCommand}" />
  • 绑定的控件必须满足ICommand接口,且执行是执行的ICommand的Execute所实现的方法,CanExecute用可不用,Execute会默认传入一个object类型的parameter参数
internal class DelegateCommand : ICommand
    {
        public event EventHandler? CanExecuteChanged;

        public bool CanExecute(object? parameter)
        {
            if (this.CanExecutefuc == null) 
            {
                return true;
            }
            return this.CanExecutefuc(parameter);
        }

        public void Execute(object? parameter)
        {
            if (ExcuteAction == null) 
            {
                return;
            }
            this.ExcuteAction(parameter);
        }

        public Func<object,bool> CanExecutefuc { get; set; }
        public Action<object> ExcuteAction { get; set; }
    }
}

给DelegateCommand的委托参数赋值

 internal class MainWindowsViewModel:NotifacationObject	{
     //构造函数给委托赋值
     public MainWindowsViewModel()
     {
          this.TestCommand = new DelegateCommand();
          this.TestCommand.ExcuteAction = new Action<object>(this.Test);
     }	
     public DelegateCommand TestCommand { get; set; }
     private void Test(object parameter) 
     {
	Text1 = 3;
     }
}
此条目发表在Wpf分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注