2018-2-13-wpf-绑定-TextLength-
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>
2018-2-13-wpf-绑定-TextLength-的更多相关文章
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
- WPF绑定的ListBox获取ListBoxItem及GoToState应用
现公司项目中需要制作一个扇形菜单,菜单项是用ListBox重写Style实现的,其数据是绑定的.菜单的每一项都有Normal,MouseOver和Selected三种状态,这三种状态当然可以通过鼠标移 ...
- WPF绑定文本时使用指定格式文本
原文:WPF绑定文本时使用指定格式文本 Text="{Binding PlayletModel.characters,StringFormat=Cast : {0}}" Strin ...
- (转)新手C#SQL语句的学习2018.08.13
1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...
- WPF绑定之索引器值变化通知
背景 在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新. 解决方案 只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyCha ...
- WPF 绑定StaticResource到控件的方法
原文:WPF 绑定StaticResource到控件的方法 资源文件内的属性能否直接通过绑定应用到控件?答案是肯定的. 比如,我们要直接把下面的<SolidColorBrush x:Key=&q ...
- WPF 绑定以基础数据类型为集合的无字段名的数据源
WPF 绑定以基础数据类型为集合的无字段名的数据源 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-21 我们在控件的数据绑定 ...
- WPF绑定xaml中绑定对象需用属性表示,字段不可以绑定
在练习WPF绑定时发现对象属性可以在XAML中绑定,但字段是不可以绑定: 比如: private Person person{get;set;} 可以绑定到XAML中,<TextBox Nam ...
- WPF绑定各种数据源之object数据源
一.WPF绑定各种数据源索引 WPF 绑定各种数据源之Datatable WPF绑定各种数据源之object数据源 WPF绑定各种数据源之xml数据源 WPF绑定各种数据源之元素控件属性 Bindin ...
- wpf绑定全局静态变量(mvvm)
原文 wpf绑定全局静态变量(mvvm) 在实际的开发中,有一些集合或者属性可能是全局的,比如当你做一个oa的时候,可能需要展示所有的人员,这时这个所有的人员列表显然可以作为全局参数,比如这里有一个全 ...
随机推荐
- [web 安全]逻辑漏洞之密码重置
原文:http://wooyun.jozxing.cc/static/drops/web-5048.html 密码找回逻辑一.用户凭证(密码找回的凭证太弱,暴力破解)1.当当网任意用户密码修改漏洞(h ...
- [python 学习] IO操作之读写文件
一.读取全部文件: # -*- coding: utf-8 -*- f = open('qq_url.txt','r'); print f.read(); f.close(); 二.读取规定长度文件 ...
- 线程工具类 - CyclicBarrier(循环栅栏)
CyclicBarrier官方文档 一.原理 CyclicBarrier是另外一种多线程并发控制实用工具.它和CountDownLatch非常类似,它也可以实现线程的计数等待,但它的功能比CountD ...
- vue大文件分片上传插件
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- 实现bind函数
面试中碰到的bind函数,今天来研究下 //1.bind的返回值是函数 var obj={ name:"zhouy" } function f() { console.log(th ...
- Linux 系统参数优化
修改系统所有进程可打开的文件数量 sysctl -w fs.file-max=2097152sysctl -w fs.nr_open=2097152 > vi /etc/sysctl.conff ...
- php strtr()函数 语法
php strtr()函数 语法 作用:转换字符串中的某些字符直线电机生产厂家 语法:strtr(string,from,to)或者strtr(string,array) 参数: 参数 描述 stri ...
- JavaScript点击事件——美女合集
Js点击事件--美女合集 实例 效果如下图: 代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- composer国内镜像
composer国内镜像 一.总结 一句话总结: 直接百度 “composer 国内镜像” 即可 直接运行:composer config -g repo.packagist composer htt ...
- 学习使用Delphi for android 调用Java类库
http://blog.csdn.net/laorenshen/article/details/41148253 学习使用Delphi for android 调用Java类库 2014-11-15 ...