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.hqwc.cn/news/162755.html

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

相关文章

鳄鱼指标的3颜色线都代表什么?澳福官网一段话明白了

投资者一直在使用鳄鱼指标进行交易&#xff0c;但是对指标上面的3种颜色的K线都代表什么不明白&#xff1f;直到看到澳福官网一段话才明白&#xff0c;原来这么简单&#xff01; 鳄鱼指标&#xff0c;这一工具是由三条移动平均线组合而成。具体来说&#xff0c;蓝线&#xff0…

行情分析——加密货币市场大盘走势(11.6)

大饼昨日下跌过后开始有回调的迹象&#xff0c;现在还是在做指标修复&#xff0c;大饼的策略保持逢低做多。稳健的依然是不碰&#xff0c;目前涨不上去&#xff0c;跌不下来。 以太周五给的策略&#xff0c;入场的已经止盈了&#xff0c;现在已经达到1884&#xff0c;已经全部吃…

java 之数据类型的转换

文章目录 package javastudy;public class arraytest{public void ad(int a,int b) {System.out.printf("ab is %f",ab);}public static void main(String[] args) {arraytest arr new arraytest();arr.ad(1.0, 2);//arr.ad(1 , 2);} }当我们的方法的数据类型是int …

Python实现Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换

Python实现Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换 前言前提条件相关介绍实验环境Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换convert_labelme_json_to_txtjsons/000000000009.json代码实现输出结果labels/000000000009.txt convert_txt_to_labelme_…

Webpack 中 Plugin 的作用是什么?常用 plugin 有哪些?

说说webpack中常见的Plugin&#xff1f;解决了什么问题&#xff1f;- 题目详情 - 前端面试题宝典 1、plugin 的作用 Plugin 是一种计算机应用程序&#xff0c;它和主应用程序互相交互&#xff0c;以提供特定的功能。 是一种遵循一定规范的应用程序接口编写出来的程序&#…

【大模型应用开发教程】04_大模型开发整体流程 基于个人知识库的问答助手 项目流程架构解析

大模型开发整体流程 & 基于个人知识库的问答助手 项目流程架构解析 一、大模型开发整体流程1. 何为大模型开发定义核心点核心能力 2. 大模型开发的整体流程1. 设计2. 架构搭建3. Prompt Engineering4. 验证迭代5. 前后端搭建 二、项目流程简析步骤一&#xff1a;项目规划与…

模拟IC经典面试题目及答案汇总,这些经典题目你刷到过几个?

有不少小伙伴说还想要更多模拟IC方向的面试题目&#xff0c;这不就来了&#xff01;&#xff08;文末可领全部面试题目&#xff09; 请描述一下 CMOS 的工艺流程 1&#xff09;光刻形成 well 阱区&#xff1a;在 p 型硅衬底上生长一层氧化层&#xff0c;涂光刻胶&#xff0c…

骨骼动画详解

【物体怎么样是在动】 当物体的位置、朝向、大小即Transform有任意一者发生变化时&#xff0c;物体在动。 但变化要达到一定的幅度时&#xff0c;我们会看到物体在动&#xff0c;幅度是多少却决于我们看这个物体的距离、方向&#xff0c;物体的朝向等因素。 这里说的幅度是指…

一文学会Scala【Scala一站式学习笔记】

文章目录 为什么要学习Scala语言什么是Scala如何快速掌握Scala语言Scala环境安装配置Scala命令行 Scala的基本使用变量数据类型操作符if 表达式语句终结符循环高级for循环 Scala的集合体系集合SetListMapArrayArrayBuffer数组常见操作Tuple总结 Scala中函数的使用函数的定义函数…

unittest 统计测试执行case总数,成功数量,失败数量,输出至文件,生成一个简易的html报告带饼图

这是一个Python的单元测试框架的示例代码&#xff0c;主要用于执行测试用例并生成测试报告。其中&#xff0c;通过unittest模块创建主测试类MainTestCase&#xff0c;并加载其他文件中的测试用例&#xff0c;统计用例的执行结果并将结果写入文件&#xff0c;最后生成一个简单的…

RISC-V处理器设计(四)—— Verilog 代码设计

一、前言 从6月底刚开始接触 risc-v 架构&#xff0c;到现在完成了一个 risc-v cpu 的设计&#xff0c;并且成功移植了 rt-thread nano 到本 cpu 上运行&#xff0c;中间经过了 4个多月的时间&#xff0c;遇到了数不清的问题&#xff0c;也想过放弃&#xff0c;但好在最后还是…

RT-Thread 10. 使用keil4编译GD32F450

1. 修改keil路径 2.增加MCU型号宏定义 3. 在ENV界面输入 scons -c scons --targetmdk44. 编译 scons --verbose提示错误 Warning: L6310W: Unable to find ARM libraries. Error: L6411E: No compatible library exists with a definition of startup symbol __main. Finish…