WPF依赖属性Binding实现

由于最近一段时间一直没有做相关方面的东西,导致好多东西都忘了,就一个依赖属性绑定还倒腾了一下。特专门把相关的实现方式存留在博客园

XAML部分,其中有一大块是实现样式的,如果有需要的可以看看,其实只要把握住这么个关键点就行了,在后台定义依赖属性,xaml部分一定要记得给窗体Name属性赋值,就比如我这里给的

 x:Name="mainWindow"再就是在binding的时候的写法
Content="{Binding ElementName=mainWindow, Path= MyContent}"这样的话就可以大功告成了。
<Window x:Class="SpringNet.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:SpringNet"
        mc:Ignorable="d"
        x:Name="mainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <ControlTemplate TargetType="{x:Type Button}" x:Key="buttonControlTemplate">
                <Border Name="RootElement">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup Name="commonStates">
                            <VisualState Name="Normal"/>
                            <VisualState Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBrush"
                                                    Storyboard.TargetProperty="Color"
                                                    To="Blue"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState Name="Pressed">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBrush"
                                                    Storyboard.TargetProperty="Color"
                                                    To="Transparent"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border.Background>
                        <SolidColorBrush x:Name="BorderBrush" Color="LightBlue"/>
                    </Border.Background>
                    <Grid Margin="4" Background="{TemplateBinding Background}">
                        <ContentPresenter
                            Content="{TemplateBinding Content}"
                            ContentTemplate="{TemplateBinding ContentTemplate}"
                            HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalAlignment}"
                            />
                    </Grid>
                </Border>
            </ControlTemplate>
            <!--数据模板-->
            <DataTemplate x:Key="buttonDataTemple">

            </DataTemplate>
            <Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
                <Style.Resources>
                    <SolidColorBrush x:Key="brush" Color="Yellow"/>
                </Style.Resources>
                <Setter Property="Height" Value="25"/>
                <Setter Property="Width" Value="75"/>
                <Setter Property="FontSize" Value="12"/>
                <Setter Property="HorizontalAlignment" Value="Center"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Setter Property="Background" Value="AliceBlue"/>
                <Setter Property="Template" Value="{StaticResource buttonControlTemplate}"/>
                <EventSetter Event="Click" Handler="btnOK_Click"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Width" Value="80"/>
                        <Setter Property="Height" Value="27"/>
                        <Setter Property="FontSize" Value="13"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Width" Value="80"/>
                            <Condition Property="Height" Value="27"/>
                        </MultiTrigger.Conditions>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="{x:Type TextBlock}" x:Key="TextBlockStyle">
                <Setter Property="Width" Value="190"/>
                <Setter Property="Height" Value="25"/>
                <Setter Property="FontSize" Value="12"/>
            </Style>
            <Style TargetType="{x:Type TextBox}" x:Key="TextBoxStyle">
                <Setter Property="Width" Value="190"/>
                <Setter Property="Height" Value="25"/>
                <Setter Property="BorderBrush" Value="Azure"/>
                <Setter Property="FontSize" Value="12"/>
            </Style>
        </Grid.Resources>
        <TextBlock x:Name="txtUser"
                 Height="23"
                 Width="390"
                   Style="{StaticResource TextBlockStyle}"
                Margin="51,149,76,147"
                 />
        <Button x:Name="btnOK"
                Content="{Binding ElementName=mainWindow, Path= MyContent}"
                Style="{StaticResource ButtonStyle}"
                >
        </Button>
    </Grid>
</Window>

后台代码实现

namespace SpringNet
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        #region 字段

        /// <summary>
        /// Spring.Net
        /// </summary>
        private IApplicationContext context = ContextRegistry.GetContext();

        #endregion

        #region 构造器

        public MainWindow()
        {
            InitializeComponent();
        }

        #endregion

        #region 事件

        /// <summary>
        /// 按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            IUserB user = context.GetObject("UserB") as IUserB;
            IList<User> list = user.GetUserList();
            foreach (var each in list)
            {
                this.txtUser.Text += each.Name + ";";
            }
        }

        #endregion

        #region 依赖属性

        public string MyContent
        {
            get { return (string)GetValue(MyContentProperty); }
            set { SetValue(MyContentProperty, value); }
        }

        // Using a DependencyProperty as the backing store for MyContent.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyContentProperty =
            DependencyProperty.Register("MyContent", typeof(string), typeof(MainWindow), new PropertyMetadata("确定"));

        public People PeopleData
        {
            get { return (People)GetValue(PeopleDataProperty); }
            set { SetValue(PeopleDataProperty, value); }
        }

        // Using a DependencyProperty as the backing store for PeopleData.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PeopleDataProperty =
            DependencyProperty.Register("PeopleData", typeof(People), typeof(MainWindow), new PropertyMetadata(null));

        public static People GetMyProperty(DependencyObject obj)
        {
            return (People)obj.GetValue(MyPropertyProperty);
        }

        public static void SetMyProperty(DependencyObject obj, int value)
        {
            obj.SetValue(MyPropertyProperty, value);
        }

        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyPropertyProperty =
            DependencyProperty.RegisterAttached("MyProperty", typeof(People), typeof(MainWindow), new PropertyMetadata(null));

        #endregion

    }

    public class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
    }
}

这段代码中还有有关spring.net的东西,所以可能比较杂乱。

时间: 2024-10-13 19:51:47

WPF依赖属性Binding实现的相关文章

WPF依赖属性详解

WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency Properties 的使用贯穿样式的使用,数据绑定,动画等等,在刚刚接触Dependency Properties的时候可能觉得有些奇怪,但是,当你了解他要解决的问题的时候,你可能就不觉得奇怪了.Dependency Properties第一个要解决的问题就是控件的属性共享问题,由于大部分的WPF控

WPF依赖属性相关博客导航

1.一站式WPF--依赖属性(DependencyProperty)一(什么是依赖属性,依赖属性的由来) 2.一站式WPF--依赖属性(DependencyProperty)二(涉及依赖属性的使用) WPF依赖属性相关博客导航

[CodeSmith] WPF依赖属性脚本

<%-- Name: WPF 依赖属性 Author: Dxq Description: 生成WPF的依赖属性 --%> <%@ Template Language="C#" TargetLanguage="Text" %> <%@ Property Name="PropertyName" Default="PropertyName" Type="System.String"

WPF——依赖属性(Dependency Property)

1.什么是依赖属性 依赖属性是一种可以自己没有值,并且通过Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象被称为“依赖对象”. 依赖项属性通过调用 Register 方法(或 RegisterReadOnly)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符标示属性. 依赖项属性只能由继承自 DependencyObject 类的类型使用,在WPF中大部分的类都可以支持依赖属性. 2.DependencyObject和DependencyP

WPF 依赖属性与依赖对象

在介绍依赖属性之前,我先介绍下属性的历史 属性的历史: 早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中就是这样的.但是为了访问某一个字段,总有设置及获得两个方法,太过分散,不利于管理.所以在C#中又引入了属性的概念,后来WPF又引入了依赖属性,可以节省实例对内存的开销,还可以通过binding依赖在其他对象上. 注意:字段是每个实例都要占用内存开销,而属性就如同方法(可以反编译查看,其实就是两个方法,这表示属

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

WPF依赖属性1

属性是.net的核心部分,是每个.net程序员都必须熟悉的特性,但是在wpf中引入了依赖属性的概念,依赖属性和原来属性的定义完全不一样,wpf通过依赖属性改变了元素属性的定义方式,依赖属性为wpf的数据绑定.动画以及样式,都起到了关键的作用,所以理解依赖属性,对于理解wpf至关重要. C#的普通属性的定义,我们十分熟悉,他是一个成员变量,增加了get/set 方法实现的一种访问器,基本定义如下: class Example {     private string name;     publi

WPF 依赖属性

依赖属性,简单的说,在WPF控件应用过程中,界面上直接可以引用的属性 如:<Button Content="aaa"></Button> Content称为Button的依赖属性 当我们自定义控件时,如何添加依赖属性呢 1.添加属性 /// <summary> /// get or set the items /// </summary> public List<TitleListItemModel> TitleListIte

WPF依赖属性DependencyProperty

写在之前: 依赖属性算是WPF醉醉基础的一个组成了.平时写代码的时候,简单的绑定很轻松,但是遇到复杂的层次比较多的绑定,真的是要命.所以,我觉得深刻认识依赖属性是很有必要的.本篇只是个人学习的记录,学习的博客是周永恒先生的<一站式WPF--依赖属性(DependencyProperty)>,这算是一个系列了,说的很详细.如果需要更好的学习,建议移步上述原文,受益匪浅. 什么是依赖属性? Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩