博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XAML: 在 MVVM 模式中,关于绑定的几处技巧
阅读量:5079 次
发布时间:2019-06-12

本文共 2331 字,大约阅读时间需要 7 分钟。

    以下会提到三个绑定的技巧,分别是

  • 在 ListView 中为 ListViewItem 的 MenuFlyout 绑定 Command;
  • 在 ListView 的 事件中绑定所选择项目,即其 SelectedItem属性;
  • 处理文本控件与数值属性绑定中默认值0的问题;

一、在 ListView 中为列表项的 MenuFlyout 绑定 Command;

    当我们为 ListView 编写了 DataTemplate,并在其中加入了 MenuFlyout 时,而且 MenuFlyoutItem 需要绑定 ViewModel 中的 XXXCommand 属性,代码类似如下:

   这时,如果运行,你会发现,点击 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属性

   先看代码,注意粗体部分:

...

   这个其实很简单,之所以记下来,是因为我原先走了一点弯路,之前没有写 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 <= 0)            {                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}}"

   如果你有更好的方法,请回复。

 

参考资料:

(以上两个链接均是针对第一个问题)

 

转载于:https://www.cnblogs.com/wpinfo/p/4599276.html

你可能感兴趣的文章
代码实现导航栏分割线
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
关于源程序到可运行程序的过程
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
软件目录结构规范
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>