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.rhkb.cn/news/183022.html

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

相关文章

民宿酒店服务预约小程序的作用

民宿往往是旅游者们前往某个城市感受风情常住的地方&#xff0c;也因此在景区或特定地方&#xff0c;总是不乏大小民宿品牌&#xff0c;但除了市场高需求外&#xff0c;商家们所遇的痛点也不少&#xff1a; 1、获客引流难 民宿生意虽然需求量高&#xff0c;但各家品牌众多&am…

微服务架构——笔记(3)Eureka

微服务架构——笔记&#xff08;3&#xff09; 基于分布式的微服务架构 本次笔记为 此次项目的记录&#xff0c;便于整理思路&#xff0c;仅供参考&#xff0c;笔者也将会让程序更加完善 内容包括&#xff1a;1.支付模块、2.消费者订单模块、支付微服务入驻Eureka、Eureka集群…

Docker 多阶段构建的原理及构建过程展示

Docker多阶段构建是一个优秀的技术&#xff0c;可以显著减少 Docker 镜像的大小&#xff0c;从而加快镜像的构建速度&#xff0c;并减少镜像的传输时间和存储空间。本文将详细介绍 Docker 多阶段构建的原理、用途以及示例。 Docker 多阶段构建的原理 在传统的 Docker 镜像构建…

Hive 解析 JSON 字符串数据的实现方式

文章目录 通过方法解析现实示例 通过序列化实现示例 通过方法解析现实 在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path)&#xff0c;该方法参数解析如下&#xff1a; json_txt&#xff1a;顾名思义&#xff0c;就是 JSON 字符串&#xff1b;…

vue3项目搭建

一&#xff1a;介绍 Vue3 是从2018年开始研发&#xff0c;经过大概一年半的不断重构与试运行&#xff0c;最终发布于2020年9月18日。相比于 Vue2 其具有更小&#xff0c;更快&#xff0c;支持性更高等功能。因此学号 Vue3 是非常有必要的&#xff0c;同时 Vue2 也将会与2023年1…

JAVA前端开发介绍

以一个网站为例包括网站设计、前端开发、程序开发等。网站设计就是网站的外观&#xff0c;平面的东西。程序开发也好理解就是功能实现。而前端开发&#xff0c;简单来说&#xff0c;就是把平面效果图转换成网页&#xff0c;把静态转换成动态。它的工作包括了:切图、写样式、做鼠…

Java根据一个List内Object的两个字段去重

背景 在Java开发过程中&#xff0c;我们经常会遇到需要对List进行去重的需求。 其中常见的情况是&#xff0c;将数组去重&#xff0c;或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论&#xff0c;有一个List&#xff0c;且其中的元素是自定义的对象&…

【JVM】JDBC案例打破双亲委派机制

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 打破双亲委派机制&#xff08;JDBC案例…

RK3568平台开发系列讲解(音视频篇)RTMP 推流

🚀返回专栏总目录 文章目录 一、RTMP 的工作原理二、RTMP 流媒体服务框架2.1、Nginx 流媒体服务器2.2、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、 WebRTC流媒体传输协议等。 R…

Halcon WPF 开发学习笔记(1):Hello World小程序

文章目录 文章专栏视频链接Hello World训练图片训练目的 开始训练图像预处理导入图像三通道处理调用算子通道选取 滤波什么是好的滤波 增加对比度 区域选取阈值处理算子参数选择运行结果(红色为选择区域) 区域分割运行结果 特征筛选参数代码第二次&#xff0c;面积筛选 画选中十…

【每日一题】统计范围内的元音字符串数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;遍历 其他语言python3 写在最后 Tag 【遍历】【数组】【2023-11-07】 题目来源 2586. 统计范围内的元音字符串数 题目解读 统计范围内的元音字符串数。 解题思路 方法一&#xff1a;遍历 遍历下标在 [left, right]…

APM建设踩了哪些坑?去哪儿旅行分布式链路追踪系统实践

一分钟精华速览 分布式链路追踪系统在企业的APM体系中扮演着重要的角色。本文分享了去哪儿旅行构建分布式链路追踪系统的实践经验。从APM整体架构设计入手&#xff0c;讲述了日志收集、Kafka传输和Flink任务处理等环节的性能优化实践和踩坑经验。 同时&#xff0c;作者结合丰…

JVM-垃圾回收

目录 1、GC过程 2、垃圾回收算法 2.1、标记-清除 2.2、标记-整理 2.3、复制 2.4、分代收集算法 3、TLAB 4、对象如何进入老年代 5、卡片标记 6、HotSpot垃圾回收器 6.1、年轻代垃圾回收器 6.2、老年代垃圾回收器 6.3、如何配置垃圾回收器 6.4、STW 7、CMS垃圾回收…

【漏洞复现】Apache_Tomcat7+ 弱口令 后台getshell漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号漏洞名称Tomcat7 弱口令 && 后台getshell漏洞漏洞评级高…

SpringBoot整合EasyExcel

springboot整合easyExcel的全流程&#xff0c;跟着做就能出来。对项目没有侵入要求。0侵入&#xff0c;可插拔 依赖 <!--操作Excel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>…

linux下实现电脑开机后软件自启动

实现linux的软件自启动&#xff0c;需要四个文件 第一个【displayScreen.desktop】文件&#xff0c;.desktop文件就是一个用来运行程序的快捷方式,也叫启动器&#xff0c;常用来自启动用的文件&#xff0c;内容如下 [Desktop Entry] #要执行的脚本位置 Exec/home/yicaobao/te…

offsetof宏的使用、模拟实现及 (size_t)(((struct_type*)0)->mem_name)的解释

宏原型&#xff1a;offsetof(type,member) 作用&#xff1a;返回数据结构或联合体类型中成员的偏移量&#xff0c;以字节为单位 返回值&#xff1a;size_t类型的无符号整数 使用案例&#xff1a; #include <stdio.h> #include <stddef.h> struct foo {ch…

Unity热更新那些事

目录 热更新方案Unity程序的两种编译方式编译阶段执行阶段Mono方式IL2CPP方式两种方式打包以后的项目目录结构 其他 ILRuntime热更新ILRuntime使用注意ILRuntime的实现原理ILRuntime的性能优化建议ILRuntime的性能优化建议 HybridCLR热更新 参考链接 Unity热更新那些事 一小时极…

pda条码二维码扫描数据采集安卓手持终端扫码热敏标签打印一体机

HT800新一代移动物联终端是深圳联强优创信息科技有限公司自主研发的基于Android11操作系统的高性能、高可靠的工业级手持数据终端&#xff0c;能与其它设备进行无线通讯&#xff0c;提供良好的操作界面&#xff0c;支持条码扫描、RFID读写&#xff08;NFC&#xff09;、GPS定位…

Android 扩大View可点击区域范围

有时候会遇到这种需求&#xff1a;本身控件显示在很小的范围内&#xff0c;但是要求扩大可点击的区域。根据官方文档https://developer.android.com/develop/ui/views/touch-and-input/gestures/viewgroup?hlzh-cn#delegate可以得知通过 TouchDelegate 类&#xff0c;让父视图…