XAML: 在 MVVM 模式中,关于绑定的几处技巧
以下会提到三个绑定的技巧,分别是
- 在 ListView 中为 ListViewItem 的 MenuFlyout 绑定 Command;
- 在 ListView 的 事件中绑定所选择项目,即其 SelectedItem属性;
- 处理文本控件与数值属性绑定中默认值0的问题;
一、在 ListView 中为列表项的 MenuFlyout 绑定 Command;
当我们为 ListView 编写了 DataTemplate,并在其中加入了 MenuFlyout 时,而且 MenuFlyoutItem 需要绑定 ViewModel 中的 XXXCommand 属性,代码类似如下:
<Page.Resources>
<DataTemplate x:Key="CategoryItemTemplate">
<Grid Holding="Grid_Holding">
<FlyoutBase.AttachedFlyout>
<MenuFlyout>
<MenuFlyoutItem x:Uid="MenuItem_Edit" Command="{Binding EditCategoryCommand}" CommandParameter="{Binding}"/>
<MenuFlyoutItem x:Uid="MenuItem_Delete" Command="{Binding DeleteCategoryCommand}" CommandParameter="{Binding}"/>
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
<TextBlock Text="{Binding Name}" FontSize="24" Margin="0,5" />
</Grid>
</DataTemplate>
</Page.Resources>
这时,如果运行,你会发现,点击 MenuFlyoutItem 时,并不会触发相应的方法,也就是说这样的绑定是无效的;一个可取的解决方案是,将 ViewModel 作为资源放到 XAML 中,然后,更改 Command 的值为:
Command="{Binding EditCategoryCommand,Source={StaticResource viewModelName}}"
这样可以解决问题,但存在两个问题:1, 这个 viewModel 是一个新创建的对象,而与你实际使用的 ViewModel 对象不是一个,所以;2, ViewModel 必须有无参数的构造函数(其实这与第一个问题是相关联的)。
在网上查了一些资料之后,终于找到一个较完美的解决方案,如下:修改 Command 的值为:
Command="{Binding DataContext.EditCategoryCommand,ElementName=pageCategory}"
其中,pageCategory 是 Page 的 x:Name 值;这样 MenuFlyoutItem 就可以正确响应你的操作了。至于修改之后的 Command 的属性值,相信你一看就明白,在此不再赘述。
二、在 ListView 的 事件中绑定所选择项目,即其 SelectedItem属性
先看代码,注意粗体部分:
<ListView x:Name="listCategory" ItemsSource="{Binding Categories}" ItemContainerStyle="{StaticResource StretchListViewItemStyle}">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="SelectionChanged">
<Core:InvokeCommandAction Command="{Binding CategorySelectedCommand}" CommandParameter="{Binding ElementName=listCategory,Path=SelectedItem}" />
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
...
这个其实很简单,之所以记下来,是因为我原先走了一点弯路,之前没有写 Path,然后到 Command 所指向的方法中,把 parameter 再转 ListView 对象,再获取它的 SelectedItem 属性;现在看来,的确是多走了一段弯路;究其原因,实在是因为自己对 WPF 中绑定还不够熟悉。
三、处理文本控件与数值属性绑定中默认值 0 的问题
当把文本框的 Text 属性绑定到一个数值属性时,如果该数值属性没有赋值,那么,运行时,它的默认值 0 会显示到文本框中,如果不希望显示默认值 0,则可以使用一个 Converter 来解决,代码如下:
public class PriceCheckConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
float result = (float)value;
if (result <= )
{
return string.Empty;
}
else
{
return result.ToString();
}
} public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return value;
}
}
而在绑定中,则直接指定该 Converter 即可,代码如下:
Text="{Binding Bill.Price,Mode=TwoWay,Converter={StaticResource PriceCheckConverter}}"
如果你有更好的方法,请回复。
参考资料:
Windows 8.1 Command Binding in a DataTemplate
How to implement a navigation button in shared application resources?
(以上两个链接均是针对第一个问题)
XAML: 在 MVVM 模式中,关于绑定的几处技巧的更多相关文章
- WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...
- 在MVVM模式中,按钮Click事件的绑定方法
在MVVM模式中,我们将Button的方法写到ViewModel中,然后绑定到前端界面.通常的做法是写一个类,继承ICommand接口,然而如果按钮比较多的话,就需要写很多的类,对于后期维护造成很大的 ...
- silverlighter下MVVM模式中利用Behavior和TargetedTriggerAction实现文本框的一些特效
在silverlight一般开发模式中,给文本框添加一些事件是轻而易举的,然而MVVM开发模式中,想要给文本框添加一些事件并非那么容易,因为MVVM模式中,只有ICommand接口,而且也只有Butt ...
- Messenger在MVVM模式中的应用
Messenger在MVVM模式中的应用 Messenger在MVVM中应用的前提 我们知道在MVVM架构中,系统平台的Silverlight客户端界面开发和业务逻辑已经被分开,XAML是SL的主要部 ...
- WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制
原文:WPF MVVM模式中,通过命令实现窗体拖动.跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护.但是,很多初学者会在使用MVVM的过程中遇到 ...
- “Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置
这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一 ...
- Vue中MVVM模式的双向绑定原理 和 代码的实现
今天带大家简单的实现MVVM模式,Object.defineProperty代理(proxy)数据 MVVM的实现方式: 模板编译(Compile) 数据劫持(Observer) Object ...
- 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API
一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...
- MVVM模式中WPF数据的完全绑定
一:截图,描述:将后台代码的姓名.年龄绑定到文本框,单击”增加年龄“--年龄自+1,单击”显示年龄“--弹出年龄的显示对话框,实现了从文本框修改年龄和后台更改年龄并显示到文本框 运行结果和解决方案管理 ...
随机推荐
- Il laser che è chiaramente visibile
Prima di quel tempo ho ottenuto questo potente puntatore laser 500mW, non so davvero come questo dis ...
- ZKWeb网页框架2.1正式发布
2.1.0更新的内容有 更新引用类库 NHibernate 5.1.0 Npgsql 3.2.7 MySqlConnector 0.37.0 Dapper 1.50.4 Dommel 1.10.1 Z ...
- Java工程师如何在1个月内做好面试准备?
作者:石杉的架构笔记 写在前面 春节长假转眼已过,即将迎来的是一年一度的金三银四跳槽季. 假如你准备在金三银四跳槽的话,那么作为一个Java工程师,应该如何利用1个月的时间,快速的为即将到来的面试进行 ...
- Javascript高级编程学习笔记(59)—— 事件(3)事件对象
事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...
- Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量
私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...
- Docker学习笔记-磁盘挂载运行.netcore
前言: 环境:centos7.5 64 位 正文: 首先我们在宿主机上安装 .NET Core SDK sudo rpm --import https://packages.microsoft.com ...
- [Postman]捕获HTTP请求(14)
如果您使用API构建客户端应用程序 - 移动应用程序,网站或桌面应用程序 - 您可能希望查看应用程序中发送和接收的实际HTTP请求流量.在某些情况下,您可能会发现甚至没有记录的API.Postma ...
- 一份从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- Winginx nginx 启动提示80端口被占用
第一步:查看80端口占用信息 win键+R运行命令:cmd-->netstat -aon|findstr "80" 2.结束任务 找到 pin=4272这个进程,将进程结束 ...
- knn算法的c语言实现
最近研究KNN,找到了一些优秀的源码,贴出来,做个笔记吧. #include<stdio.h> #include<stdlib.h> #include<math.h> ...