WPF usercontrol 自定义依赖属性
1.依赖属性不同意一般属性,一般属性主要定义在对象中,而依赖属性是存在一个特殊的依赖属性表中。
2.当我们触发改变值时,需要通过SetValue这种方式进行触发。
UserControl1.xaml:
<UserControl x:Class="WpfApplication1.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApplication1" mc:Ignorable="d" Name="myUserControl" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <TextBox Name="textBox" TextChanged="textBox_TextChanged"></TextBox> </Grid> </UserControl>
UserControl1.xml.cs:
using System; using System.Collections.Generic; using System.ComponentModel; 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 WpfApplication1 { /// <summary> /// UserControl1.xaml 的交互逻辑 /// </summary> public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public static readonly DependencyProperty TextContentProperty; static UserControl1() { UserControl1.TextContentProperty = DependencyProperty.Register("TextContent", typeof(string), typeof(UserControl1)); } public string TextContent { get { return (string)GetValue(UserControl1.TextContentProperty); } set { SetValue(UserControl1.TextContentProperty, value); } } private void textBox_TextChanged(object sender, TextChangedEventArgs e) { TextBox box = (TextBox)sender; this.SetValue(TextContentProperty, box.Text); } } }
MainWindow.xaml:
<Window x:Class="WpfApplication1.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:WpfApplication1" mc:Ignorable="d" Name="MainWindowName" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock Name="tc" Grid.Row="0" Width="100" Height="30" Text="{Binding MyValue,ElementName=MainWindowName}"></TextBlock> <local:UserControl1 x:Name="uc" Grid.Row="1" Width="50" Height="50" TextContent="{Binding MyValue,Mode=TwoWay,ElementName=MainWindowName}"></local:UserControl1> </Grid> </Window>
MainWindow.xaml.cs:
using System; using System.Collections.Generic; using System.ComponentModel; 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 WpfApplication1 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window,INotifyPropertyChanged { public MainWindow() { InitializeComponent(); this.DataContext = this; } private string myVar; public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } public string MyValue { get { return myVar; } set { myVar = value; OnPropertyChanged("MyValue"); } } } }