title author date CreateTime categories
wpf 绑定 TextLength
lindexi
2018-2-13 17:23:3 +0800
2018-2-13 17:23:3 +0800
WPF

我看到朋友的代码出现绑定了 一个 TextBlock 的 Text 的 length ,那时候我觉得 length 不是依赖属性,绑定了是无法通知的。最后我做了实验才发现,原因有 Text 可以通知。

请看简单的代码,界面就是一个 TextBlock 和两个按钮,其中一个按钮是绑定了 length 如果大于 0 才可以使用。一个按钮是把 TextBlock 的文字设置为空或者设置为任意字符串。

    <Grid>
<Grid.Resources>
<local:LengthToBoolenConverter x:Key="LengthToBoolenConverter"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="79*"/>
<RowDefinition Height="28*"/>
</Grid.RowDefinitions>
<TextBlock x:Name="TitleBlock" Margin="0,0,-0.6,-0.2" ></TextBlock>
<Grid Grid.Row="1">
<Button Margin="10,10,10,10" HorizontalAlignment="Left" Content="确定" Click="ButtonBase_OnClick"></Button>
<Button Margin="10,10,10,10" HorizontalAlignment="Right" IsEnabled="{Binding ElementName=TitleBlock,Path=Text.Length,Converter={StaticResource LengthToBoolenConverter}}" Content="确定"></Button>
</Grid>
</Grid> public class LengthToBoolenConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var length = (int?) value;
return length > 0;
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
} private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(TitleBlock.Text))
{
TitleBlock.Text = "1";
}
else
{
TitleBlock.Text = "";
}
}

看到IsEnabled="{Binding ElementName=TitleBlock,Path=Text.Length,Converter={StaticResource LengthToBoolenConverter}}" 绑定就是 Text.Length ,但是 Length 不是依赖属性,没有通知,那么在 Text 变化时是否会通知?会的,因为使用的是 Text 的 Length,所以在 Text 修改时就会改变了 Length 。

如果有一个 Model 类,这个类是没有继承通知的,那么如何在里面的属性修改时,可以通知?一个方法就是在 ViewModel 使用 Model 属性,每次都是修改整个 Model

    class Model
{
public string Foo { set; get}
//其他就不写了
} class ViewModel : INotifyPropertyChanged
{
public void Foo()
{
var model = new Model()
{
Foo = Model.Foo,
//复制所有属性
};
model.Foo = "新的";
Model = model;
} private Model _model; public Model Model
{
get { return _model; }
set
{
_model = value;
OnPropertyChanged();
}
} public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

这样可以不修改 Model 就可以在修改属性通知,但是可以看到这需要复制所有属性,不过我有写了C# 使用Emit深克隆使用这个就可以做快复制,而且还是深复制,但是复制不是真的深,代码复制是一层,如果需要实现真的复制,还需要自己去写

那么不复制是否可以做?可以,只需要调用OnPropertyChanged

请把上面的代码做修改,添加一个函数,这个函数更新会自动通知。

        public void Foo(string str)
{
Model.Foo = str;
OnPropertyChanged(nameof(Model));
}

在按钮点击就把代码修改为

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(TitleBlock.Text))
{
ViewModel.Foo("1");
}
else
{
ViewModel.Foo("");
}
}

需要添加一些绑定,请看代码

        public ViewModel ViewModel { get; set; } = new ViewModel();

设置了 DataContext 之后就可以在界面绑定,这时可以看到和直接设置TextBlock的文字看起来是一样

        <TextBlock x:Name="TitleBlock" Margin="0,0,-0.6,-0.2" Text="{Binding Model.Foo}"></TextBlock>

源代码:[免费]WpfTextLengthdc-CSDN下载

2018-2-13-wpf-绑定-TextLength-的更多相关文章

  1. WPF快速入门系列(4)——深入解析WPF绑定

    一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...

  2. WPF绑定的ListBox获取ListBoxItem及GoToState应用

    现公司项目中需要制作一个扇形菜单,菜单项是用ListBox重写Style实现的,其数据是绑定的.菜单的每一项都有Normal,MouseOver和Selected三种状态,这三种状态当然可以通过鼠标移 ...

  3. WPF绑定文本时使用指定格式文本

    原文:WPF绑定文本时使用指定格式文本 Text="{Binding PlayletModel.characters,StringFormat=Cast : {0}}" Strin ...

  4. (转)新手C#SQL语句的学习2018.08.13

    1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...

  5. WPF绑定之索引器值变化通知

    背景 在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新. 解决方案 只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyCha ...

  6. WPF 绑定StaticResource到控件的方法

    原文:WPF 绑定StaticResource到控件的方法 资源文件内的属性能否直接通过绑定应用到控件?答案是肯定的. 比如,我们要直接把下面的<SolidColorBrush x:Key=&q ...

  7. WPF 绑定以基础数据类型为集合的无字段名的数据源

    WPF 绑定以基础数据类型为集合的无字段名的数据源 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-21 我们在控件的数据绑定 ...

  8. WPF绑定xaml中绑定对象需用属性表示,字段不可以绑定

    在练习WPF绑定时发现对象属性可以在XAML中绑定,但字段是不可以绑定: 比如: private Person person{get;set;}  可以绑定到XAML中,<TextBox Nam ...

  9. WPF绑定各种数据源之object数据源

    一.WPF绑定各种数据源索引 WPF 绑定各种数据源之Datatable WPF绑定各种数据源之object数据源 WPF绑定各种数据源之xml数据源 WPF绑定各种数据源之元素控件属性 Bindin ...

  10. wpf绑定全局静态变量(mvvm)

    原文 wpf绑定全局静态变量(mvvm) 在实际的开发中,有一些集合或者属性可能是全局的,比如当你做一个oa的时候,可能需要展示所有的人员,这时这个所有的人员列表显然可以作为全局参数,比如这里有一个全 ...

随机推荐

  1. mysql 5.6 datetime default now()

    CREATE TABLE `test` (   id int,   `gmt_create` datetime  DEFAULT NOW() not NULL )ENGINE=InnoDB; mysq ...

  2. 【leetcode】1033. Moving Stones Until Consecutive

    题目如下: Three stones are on a number line at positions a, b, and c. Each turn, you pick up a stone at ...

  3. iview之——table中嵌套input、select等

    使用iview在table中嵌入button是比较常见的需求,但是在table中嵌入input或者select你是否考虑过呢?本文用实例介绍input和select在table中的嵌套. 理解tabl ...

  4. 20180816-Java 多态

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...

  5. 170817关于JSON知识点

    1.  JSON                [1] JSON简介                         JSON全称 JavaScript Object Notation         ...

  6. Spring Boot 集成 RabbitMQ 实战

    Spring Boot 集成 RabbitMQ 实战 特别说明: 本文主要参考了程序员 DD 的博客文章<Spring Boot中使用RabbitMQ>,在此向原作者表示感谢. Mac 上 ...

  7. 浅析java中的string

    在学习java36讲的时候看到评论区有人提出的一个问题: String s1 = new String("do"); s1.intern(); String s2 = " ...

  8. Day1 方法的重载

    方法的重载 方法的标识符包括: 1.方法名称   2.方法的参数(参数类型和参数的数量) 方法的重载:方法名称相同 但是方法参数不同(1.参数类型不同 2.参数类型相同 但是参数个数不同 3.类型和个 ...

  9. 【经验分享】 解决CentOS7 安装VMTools提示找不到Kernel头文件的方案

    配置一个Linux的开发环境,用VM10+CentOS7(Kernel版本3.10.0-327.10.1.el7),之后发现VMTools功能不全,查证后发现需要卸载重装,于是开始折腾. 按照各种说明 ...

  10. 求 主板型号 945GME - ICH7M/U 支持的最大内存,以及内存型号 10

    https://zhidao.baidu.com/question/400302290.html 求 主板型号 945GME - ICH7M/U 支持的最大内存,以及内存型号 10 主板型号 明基 J ...