目录
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变化
- TwoWay(defualt):
<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;
}
}