WPF中的Binding的常见知识点与技巧

完全来源于十月的寒流,感谢大佬讲解
在这里插入图片描述

在XAML中,可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性:

  1. 属性:可以绑定到对象的属性,例如控件的TextVisibilityIsEnabled等属性。

  2. 集合:可以绑定到集合数据,如ListObservableCollectionArray等。在绑定到集合时,还可以使用索引器绑定到特定项。

  3. 静态资源:可以使用x:Static引用静态字段或属性,如常量、枚举、静态类的属性等。

  4. 数据上下文:在WPF和其他XAML框架中,每个元素都有一个数据上下文,可以在此上下文中绑定到其父元素的属性或继承的数据上下文的属性。

  5. 数据模型:可以绑定到MVVM(Model-View-ViewModel)模式中的数据模型,通常是一个实现INotifyPropertyChanged接口的类。

  6. XML和JSON数据:可以绑定到XML或JSON数据,使用XMLDataProvider或ObjectDataProvider等。

  7. 资源字典:可以绑定到资源字典中的资源,如样式、模板、图像等。

  8. 命令:可以使用Command绑定到自定义命令,以在用户交互时执行操作。

  9. 视觉状态:可以绑定到不同的视觉状态,以根据应用程序的当前状态更改UI。

  10. 动画:可以绑定到动画属性,以在动画执行时更改UI元素的属性。

这些只是一些常见的绑定数据源,实际上,XAML绑定是非常灵活的,可以将其用于几乎任何具有属性或数据的地方。数据绑定是XAML中非常强大的特性,可以用于创建动态、交互式和可扩展的用户界面。

一、Source

<Window x:Class="BindingTest.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:BindingTest"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.DataContext><local:MainWindowViewModel></local:MainWindowViewModel></Window.DataContext><Window.Resources></Window.Resources><StackPanel><TextBlock Text="{Binding}" FontSize="30"></TextBlock></StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace BindingTest
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}}public class MainWindowViewModel{public string Message => "this is test";public override string ToString(){return "hello world"; }}
}

后台实现binding

<Window x:Class="BindingTest.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:BindingTest"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"><Window.DataContext><local:MainWindowViewModel></local:MainWindowViewModel></Window.DataContext><Window.Resources></Window.Resources><StackPanel><TextBlock x:Name="tbl" FontSize="30"></TextBlock></StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace BindingTest
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){var binding = new Binding{Path = new PropertyPath("Message"),Mode = BindingMode.TwoWay,};BindingOperations.SetBinding(tbl, TextBlock.TextProperty, binding);}}public class MainWindowViewModel{private string message = "this is test";public string Message{get { return message; }set { message = value; }}}
}

绑定StaticResource资源

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"><Window.DataContext><local:MainWindowViewModel></local:MainWindowViewModel></Window.DataContext><Window.Resources><sys:String x:Key="str">Hello, World</sys:String></Window.Resources><StackPanel><TextBlock x:Name="tbl" FontSize="30" Text="{Binding Source={StaticResource str}}"></TextBlock></StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace BindingTest
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){}}public class MainWindowViewModel{private string message = "this is test";public string Message{get { return message; }set { message = value; }}}
}

使用StaticResource和DynamicResource资源

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"><Window.DataContext><local:MainWindowViewModel></local:MainWindowViewModel></Window.DataContext><Window.Resources><sys:String x:Key="str">Hello, World</sys:String></Window.Resources><StackPanel><!--<TextBlock x:Name="tbl_1" FontSize="30" Text="{Binding Source={DynamicResource str}}"></TextBlock>--><TextBlock x:Name="tbl_2" FontSize="30" Text="{Binding Source={StaticResource str}}"></TextBlock><TextBlock x:Name="tbl_3" FontSize="30" Text="{DynamicResource str}"></TextBlock>        </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace BindingTest
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){this.Resources["str"] = "GoodBye";}}public class MainWindowViewModel{private string message = "this is test";public string Message{get { return message; }set { message = value; }}}
}

       这是尝试在TextBlock元素的Source属性上使用DynamicResource,但是Source属性不是DependencyProperty,因此无法直接使用DynamicResource。只能在DependencyObject的DependencyProperty上使用DynamicResource。

<TextBlock x:Name="tbl_1" FontSize="30" Text="{Binding Source={DynamicResource str}}"></TextBlock>

       要在TextBlock中使用DynamicResource,应该将DynamicResource绑定到Text属性,而不是Source属性。例如,可以这样修改XAML:

<TextBlock x:Name="tbl_1" FontSize="30" Text="{DynamicResource str}"></TextBlock>

       这将允许使用DynamicResource来绑定Text属性,而不会引发异常。DynamicResource通常用于将资源动态应用到具有DependencyProperty的元素,而不是Source属性。

使用属性、静态属性、常量资源

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"><Window.DataContext><local:MainWindowViewModel></local:MainWindowViewModel></Window.DataContext><Window.Resources><sys:String x:Key="str">Hello, World</sys:String><local:MyResource x:Key="myres"></local:MyResource></Window.Resources><StackPanel><!--<TextBlock x:Name="tbl_1" FontSize="30" Text="{Binding Source={DynamicResource str}}"></TextBlock>--><!--<TextBlock x:Name="tbl_2" FontSize="30" Text="{Binding Source={StaticResource str}}"></TextBlock>--><!--<TextBlock x:Name="tbl_3" FontSize="30" Text="{DynamicResource str}"></TextBlock>--><TextBlock FontSize="30" Text="{Binding Source={StaticResource myres}, Path=Message}"></TextBlock><TextBlock FontSize="30" Text="{Binding Source={x:Static local:MyResource.StaticString}}"></TextBlock><TextBlock FontSize="30" Text="{Binding Source={x:Static local:MyResource.ConstString}}"></TextBlock></StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace BindingTest
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){this.Resources["str"] = "GoodBye";}}public class MyResource{public string Message { get; } = "Public Property";public static string StaticString { get; } = "Static String";public const string ConstString = "Const String";}public class MainWindowViewModel{private string message = "this is test";public string Message{get { return message; }set { message = value; }}}
}

待学习
<CollectionViewSource></CollectionViewSource>
<ObjectDataProvider></ObjectDataProvider>

二、ElementName

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"><Window.DataContext><local:MainWindowViewModel></local:MainWindowViewModel></Window.DataContext><Window.Resources></Window.Resources><StackPanel><TextBox FontSize="30" x:Name="txt"></TextBox><TextBox FontSize="30" Text="{Binding ElementName=txt, Path=Text, Mode=TwoWay}"></TextBox></StackPanel>
</Window>

在上述XAML代码中,第二个试图通过绑定将其文本与第一个TextBox的文本同步,而且将绑定模式设置为TwoWay。理论上,这意味着当更改第二个TextBox中的文本时,第一个TextBox的文本也应该相应地更改。

然而,在这里遇到的问题可能是由于两个TextBox之间的绑定路径的问题。具体来说,第二个TextBox的绑定路径ElementName=txt, Path=Text指示它应该与txt元素的Text属性进行双向绑定。这意味着它将复制txt元素的Text属性的值,但并不会与txtText属性绑定在一起,所以当更改第二个TextBox的文本时,第一个TextBox的文本不会随之更改。

如果想要实现两个TextBox之间的文本同步,可以尝试以下修改:

<StackPanel><TextBox FontSize="30" x:Name="txt"></TextBox><TextBox FontSize="30" Text="{Binding ElementName=txt, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>

通过添加UpdateSourceTrigger=PropertyChanged,可以确保当第二个TextBox的文本更改时,立即将值传播回数据源(即第一个TextBoxText属性),从而实现双向绑定。这样,当更改第二个TextBox的文本时,第一个TextBox的文本也会跟着变化。

UpdateSourceTrigger介绍
UpdateSourceTrigger 是一个在数据绑定中用于指定何时更新数据源的属性。它通常用于WPF(Windows Presentation Foundation)、Windows Forms 和其他.NET应用程序中,用于将用户界面(UI)元素与数据源绑定起来。

以下是 UpdateSourceTrigger 的四个枚举值及其含义:

  1. Default:

    • 这是默认选项,通常情况下不需要显式设置。其行为取决于数据绑定上下文。
    • 通常,在大多数情况下,它的行为类似于 PropertyChanged,即当绑定的属性的值发生更改时立即更新数据源。
  2. PropertyChanged:

    • 当绑定的属性的值发生更改时,立即更新数据源。
    • 这是最常见的选项,特别是对于实时反馈或实时验证非常有用,因为每次属性值变化时都会立即更新数据源。
  3. LostFocus:

    • 数据源会在 UI 元素失去焦点(例如,用户离开输入框)时更新。
    • 这在需要减少数据源更新频率以提高性能的情况下可能很有用,因为它允许用户在输入数据之后再进行更新。
  4. Explicit:

    • 数据源只会在显式调用更新操作时进行更新。这通常需要通过编程来触发数据源的更新,而不是依赖于自动的值更改或 UI 元素失去焦点。
    • 这个选项适用于需要精确控制何时进行数据源更新的情况,可能需要在用户操作之后执行自定义逻辑。

异同点:

  • PropertyChangedLostFocus 会在特定的条件下自动触发数据源更新,分别是属性值更改和 UI 元素失去焦点。而 Explicit 需要手动触发更新。
  • Default 是一个根据上下文自动确定更新时机的选项,通常情况下表现为 PropertyChanged,但可以根据数据绑定上下文的不同而有所不同。

PopupRoot嵌套显示—代码有错误

<Window x:Class="Test_06.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:Test_06" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10"><TextBox x:Name="txt" FontSize="30"></TextBox><TextBlock Text="{Binding ElementName=txt, Path=Text}" FontSize="30"><TextBlock.ToolTip><TextBlock Text="{Binding ElementName=txt, Path=Text}" FontSize="30"></TextBlock></TextBlock.ToolTip></TextBlock></StackPanel>
</Window>

PopupRoot嵌套显示—代码修改正确

<Window x:Class="Test_06.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:Test_06" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10"><TextBox x:Name="txt" FontSize="30"></TextBox><TextBlock Text="{Binding ElementName=txt, Path=Text}" FontSize="30"><TextBlock.ToolTip><TextBlock Text="{Binding Source={x:Reference Name=txt}, Path=Text}" FontSize="30"></TextBlock></TextBlock.ToolTip></TextBlock><DataGrid><DataGrid.Columns><!--<DataGridTextColumn Header="{Binding ElementName=txt, Path=Text}" FontSize="30"></DataGridTextColumn>--><DataGridTextColumn Header="{Binding Source={x:Reference Name=txt}, Path=Text}" FontSize="30"></DataGridTextColumn></DataGrid.Columns></DataGrid></StackPanel>
</Window>

在WPF(Windows Presentation Foundation)中,SourceElementName 都用于数据绑定表达式,但有不同的用途。

  1. ElementName

    • ElementName 用于绑定到 XAML 标记中的另一个元素。指定要绑定到的元素的名称,然后引用其属性或数据上下文。
    • 例如,Header="{Binding ElementName=txt, Path=Text}" 表示正在将 Header 属性绑定到名称为 “txt” 的元素的 Text 属性。
  2. Sourcex:Reference

    • Source 用于在绑定表达式中直接指定数据的来源。在这种情况下,您可以使用 x:Reference 标记扩展来通过其 x:Name 引用另一个元素。
    • 例如,Header="{Binding Source={x:Reference txt}, Path=Text}" 表示您正在将 Header 属性绑定到具有 x:Name 为 “txt” 的元素的 Text 属性。

关键区别在于,ElementName 依赖于元素的 Name 属性来引用同一视觉树中的元素,而 Sourcex:Reference 直接通过 x:Name 引用元素。使用 x:Reference 可以在元素没有设置 Name 属性的情况下引用它,或者用于引用在当前视觉树之外定义的元素(例如,在不同资源字典中定义或在当前控件范围之外定义的元素)。

两者之间的区别总结:

  • ElementName 使用元素的 Name 属性在同一视觉树内引用元素。
  • Sourcex:Reference 使用元素的 x:Name 属性引用元素,可以用于位于当前视觉树之外或没有 Name 属性的元素。

RelativeSource绑定父级

<Window x:Class="Test_06.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:Test_06" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10"><Grid Tag="Level 3"><Grid Tag="Level 2"><Grid Tag="Level 1"><TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid, AncestorLevel=1}, Path=Tag}" FontSize="30"></TextBlock></Grid></Grid></Grid></StackPanel>
</Window>
<Window x:Class="Test_06.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:Test_06" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10"><TextBox x:Name="str" FontSize="30"></TextBox><!--<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid, AncestorLevel=1}, Path=Tag}" FontSize="30"></TextBlock>--><TextBlock FontSize="30" Text="{Binding RelativeSource={RelativeSource AncestorType=StackPanel}, Path=Children[0].Text}"></TextBlock></StackPanel>
</Window>

在这里插入图片描述

绑定自己

方法一

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10" RenderTransformOrigin="0.5,0.5"><TextBox x:Name="str" FontSize="30"></TextBox><!--<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid, AncestorLevel=1}, Path=Tag}" FontSize="30"></TextBlock>--><TextBlock FontSize="30" Text="{Binding RelativeSource={RelativeSource Mode=Self}}"></TextBlock></StackPanel>
</Window>

方法二

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10" RenderTransformOrigin="0.5,0.5"><TextBox x:Name="str" FontSize="30"></TextBox><!--<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid, AncestorLevel=1}, Path=Tag}" FontSize="30"></TextBlock>--><TextBlock FontSize="30" Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}"></TextBlock></StackPanel>
</Window>

方法三

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10" RenderTransformOrigin="0.5,0.5"><TextBox x:Name="str" FontSize="30"></TextBox><!--<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid, AncestorLevel=1}, Path=Tag}" FontSize="30"></TextBlock>--><TextBlock FontSize="30" Text="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=ActualWidth}"></TextBlock></StackPanel>
</Window>

方法四,不推荐

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10" RenderTransformOrigin="0.5,0.5"><TextBox x:Name="str" FontSize="30"></TextBox><!--<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid, AncestorLevel=1}, Path=Tag}" FontSize="30"></TextBlock>--><TextBlock FontSize="30" Text="{Binding RelativeSource={RelativeSource 2}, Path=ActualWidth}"></TextBlock></StackPanel>
</Window>

ListBoxItem是否被选中

<Window x:Class="BindingTest.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:BindingTest" xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" ><Window.Resources></Window.Resources><StackPanel x:Name="panel" Margin="10"><ListBox><TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"></TextBox><TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"></TextBox><TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"></TextBox><TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"></TextBox></ListBox></StackPanel>
</Window>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】五中IO模型介绍 + 多路转接中select和poll服务器的简单编写

高级IO 前言正式开始前面的IO函数简单过一遍什么叫做低效的IO钓鱼的例子同步IO和异步IO五种IO模型阻塞IO非阻塞IO信号驱动多路转接异步IO 小结 代码演示非阻塞IO多路转接select介绍简易select服务器timeout 为 nullptrtimeout 为 {0, 0}timeout 为 {5, 0}调用accept select编写…

第二证券:消费电子概念活跃,博硕科技“20cm”涨停,天龙股份斩获10连板

消费电子概念7日盘中再度拉升&#xff0c;到发稿&#xff0c;博硕科技“20cm”涨停&#xff0c;光大同创、波长光电涨超10%&#xff0c;易德龙、向阳科技、得润电子、天龙股份、同兴达等涨停。 博硕科技强势涨停&#xff0c;公司昨日在接受安排调研时表明&#xff0c;公司从上…

前端框架Vue学习 ——(四)Axios

文章目录 Axios 介绍Axios 入门Vue项目中使用 Axios Axios 介绍 介绍: Axios 对原生的 Ajax 进行了封装&#xff0c;简化书写&#xff0c;快速开发。&#xff08;异步请求&#xff09; 官网: https://www.axios-http.cn/ 官网介绍&#xff1a;Axios 是一个基于 promise 网络请…

数据结构和算法是人工智能的基石

文章目录 1. 引言2. 主要内容3. 联合推荐4. 购买方式5. 总结 1. 引言 数据结构和算法是计算机科学的基石&#xff0c;是计算机的灵魂&#xff0c; 要想成为计算机专业人员&#xff0c;学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学…

php实现钉钉机器人推送消息和图片内容(完整版)

先来看下实现效果: 代码如下: function send_dingtalk_markdown($webhook , $title , $message "", $atMobiles [], $atUserIds []) {$data ["msgtype" > "markdown","markdown" > ["title" > $title,&quo…

Luckysheet 实现excel多人在线协同编辑

前言 前些天看到Luckysheet支持协同编辑Excel&#xff0c;正符合我们协同项目的一部分&#xff0c;故而想进一步完善协同文章&#xff0c;但是遇到了一下困难&#xff0c;特此做声明哈&#xff0c;若侵权&#xff0c;请联系我删除文章&#xff01; 若侵犯版权、个人隐私&#x…

五、计算机网络

&#xff08;一&#xff09;OSI/RM 七层模型 七层模型是计算机网络的基石&#xff0c;整个计算机网络是构建与七层模型之上的。 在数据链路层&#xff0c;数据开始以帧为单位&#xff0c;网卡的 MAC 地址就是数据帧的地址&#xff0c;数据的传输开始有地址了。 局域网是工作…

目标检测中的评价指标

目标检测中的评价指标 将检测目标分为正样本和负样本。 真阳性&#xff08;true positives , TP&#xff09; : 正样本被正确识别为正样本。 假阳性&#xff08;false positives, FP&#xff09;: 负样本被错误识别为正样本。 假阴性&#xff08;false negatives, FN&#…

Floor报错注入理论及实战

rand()函数&#xff1a;随机返回0-1之间的小数 floor()函数&#xff1a;小数向下取证书。向上取整数ceiling() concat_ws函数&#xff1a;将括号内数据用第一个字段连接起来 group by子句&#xff1a;分组语句&#xff0c;常用语结合统计函数&#xff0c;根据一个或多个列&a…

word统计全部字符数。

问题描述&#xff1a;在投稿SCI论文时&#xff0c;有时会要求提交一个highlight文档&#xff0c;要求不超过85个字符。 具体如下&#xff1a;maximum 85 characters per bullet point including spaces 这里的字符不单单包括字母和汉字&#xff0c;还包括标点和空格键。那么如…

5G及其后的5G非地面网络:趋势和研究挑战-HARQ部分

NTN组件纳入5G架构第一步 在NTN SI中定义了一组架构选项。就NT部分而言&#xff0c;已确定了两大类&#xff1a;星载&#xff08;即基于卫星的通信平台&#xff09;和机载&#xff08;即HAPS&#xff09;设备 并行管理HARQ最大进程数 NHARQRTT(NTX−1)2μ NTX&#xff1a;传输…

【Vue】vant2使用van-tree-select实现【全选、反选、搜索】,自定义组件,拿去即用。2.0版本保姆级教程

系列文章目录 这是原篇教程&#xff0c;本篇为升级版&#xff0c;旧版已废弃。对你们不友好。 【Vue】vue2移动端 &#xff0c;vant2使用van-tree-select分类选择实现【全选】和【取消全选】、【搜索过滤当前children】&#xff0c;只影响当前显示children&#xff0c;并且去重…

破解密码 LLM(代码LLM如何从 RNN 发展到 Transformer)

舒巴姆阿加瓦尔 一、说明 近年来&#xff0c;随着 Transformer 的引入&#xff0c;语言模型发生了显着的演变&#xff0c;它彻底改变了我们执行日常任务的方式&#xff0c;例如编写电子邮件、创建文档、搜索网络甚至编码方式。随着研究人员在代码智能任务中应用大型语言模型&am…

Docker概述

Docker概述 Docker概述Docker安装Docker命令 镜像命令容器命令操作命令 … Docker镜像容器数据卷DockerFileDocker网络管理IDEA整合DockerDocker ComposeDocker Swarm 简化版的K8s Docker为什么出现&#xff1f; 传统的项目部署&#xff0c;环境配置是十分麻烦&#xff0c;第…

如何利用JSON Schema校验JSON数据格式

最近笔者在工作中需要监控一批http接口&#xff0c;并对返回的JSON数据进行校验。正好之前在某前端大神的分享中得知这个神器的存在&#xff0c;调研一番之后应用在该项目中&#xff0c;并取得了不错的效果&#xff0c;特地在此分享给各位读者。<br style"box-sizing: …

STM32 IIC 实验

1. 可以选择I2C1&#xff0c;也可以选择I2C2&#xff0c;或者同时选择&#xff0c;同时运行 配置时钟信号 为节约空间&#xff0c;选择这两个&#xff0c;然后选择GENERATE CODE 二、HAL_I2C_Mem_Write I2C_HandleTypeDef *hi2c&#xff1a;I2C设备句柄 uint16_t DevAddress&am…

IDEA JAVA项目 导入JAR包,打JAR包 和 JAVA运行JAR命令提示没有主清单属性

一、导入JAR包 1、java项目在没有导入该jar包之前&#xff0c;如图&#xff1a;2、点击 File -> Project Structure&#xff08;快捷键 Ctrl Alt Shift s&#xff09;&#xff0c;点击Project Structure界面左侧的“Modules”如图&#xff1a;3.在 “Dependencies” 标签…

《006.Springboot+vue之旅游信息推荐系统》【有文档】

《006.Springbootvue之旅游信息推荐系统》【有文档】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; …

nodejs express uniapp 图书借阅管理系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;mysql5.7&#xff0c;HBuilder X&#xff0c;vscode&#xff08;webstorm&#xff09; 技术说明&#xff1a; nodejs express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示轮播图&am…

为全志T507-H开发板配置Samba服务,高效实现跨系统的文件共享

作为一款经典的国产芯&#xff0c;全志T507-H芯片被广泛应用于车载电子、电力、医疗、工业控制、物联网、智能终端等诸多领域当中&#xff0c;而在各种复杂的嵌入式Linux应用场景当中&#xff0c;“打通ARM板卡与Windows设备间的壁垒以实现跨平台的文件共享”是一项不能被忽视的…