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

  • 在 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 <= 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}}"

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

WinRT 开发:在 MVVM 模式中,关于绑定的几处技巧的更多相关文章

  1. 在MVVM模式中,按钮Click事件的绑定方法

    在MVVM模式中,我们将Button的方法写到ViewModel中,然后绑定到前端界面.通常的做法是写一个类,继承ICommand接口,然而如果按钮比较多的话,就需要写很多的类,对于后期维护造成很大的 ...

  2. “Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

    这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一 ...

  3. WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

    原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...

  4. silverlighter下MVVM模式中利用Behavior和TargetedTriggerAction实现文本框的一些特效

    在silverlight一般开发模式中,给文本框添加一些事件是轻而易举的,然而MVVM开发模式中,想要给文本框添加一些事件并非那么容易,因为MVVM模式中,只有ICommand接口,而且也只有Butt ...

  5. Messenger在MVVM模式中的应用

    Messenger在MVVM模式中的应用 Messenger在MVVM中应用的前提 我们知道在MVVM架构中,系统平台的Silverlight客户端界面开发和业务逻辑已经被分开,XAML是SL的主要部 ...

  6. WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制

    原文:WPF MVVM模式中,通过命令实现窗体拖动.跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护.但是,很多初学者会在使用MVVM的过程中遇到 ...

  7. Vue中MVVM模式的双向绑定原理 和 代码的实现

      今天带大家简单的实现MVVM模式,Object.defineProperty代理(proxy)数据   MVVM的实现方式: 模板编译(Compile) 数据劫持(Observer) Object ...

  8. JavaScript大杂烩18 - Web开发的MVVM模式

    MVC VS. MVP VS. MVVM  了解MVVM模式之前,我们先来简单了解一下从MVC到MVVM的变迁.这个变迁是耦合从紧到松的变迁,是对依赖处理的进化,是应对变化技术的成熟. MVC  MV ...

  9. 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API

    一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...

随机推荐

  1. 预防cdn链接失效,无缝切换本地文件

    如今的前端项目追求的不仅仅是能用能看的程度,而是愈发追求项目的性能,对用户体验的影响.而现在的开发工具在性能优化方面也替我们做很大一部分的工作,想必大家对CDN的使用都是轻车熟路了,但是大家有没有考虑 ...

  2. 树莓派编译ncnn

    1.从github上下载ncnn git clone --recursive https://github.com/Tencent/ncnn 2.在ncnn根目录下创建build目录,安装cmake编 ...

  3. Python基础——类

    创建类 class people: '帮助信息:dsafdaf' #所有实例都会共享的 number=100 #构造函数,初始化的方法,当创建一个类的时候,首先会调用它 def __init__(se ...

  4. JAVA基础篇—多态

    class ColaEmployee父类 package com.cola; public class ColaEmployee { private String name; private int ...

  5. JAVA基础篇—抽象类,抽象方法

    class Shape package com.shape; public abstract class Shape { double area;// double per;// String col ...

  6. LeetCode(165) Compare Version Numbers

    题目 Compare two version numbers version1 and version2. If version1 > version2 return 1, if version ...

  7. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Take Your Seat

    /* 证明过程如下 :第一种情况:按1到n的顺序上飞机,1会随意选一个,剩下的上去时若与自己序号相同的座位空就坐下去,若被占了就也会随意选一个.求最后一个人坐在应坐位置的概率 */ #include ...

  8. centos配置jdk

    ########## config jdk ########## export JAVA_HOME=/usr/local/java/jdk1.7.0_79 export CLASSPATH=.:${J ...

  9. Android开发——AsyncTask的使用以及源码解析

    .AsyncTask使用介绍  转载请标明出处:http://blog.csdn.net/seu_calvin/article/details/52172248 AsyncTask封装了Thread和 ...

  10. activity-alias

    activity-alias标签,它有一个属性叫android:targetActivity,这个属性就是用来为该标签设置目标Activity的,或者说它就是这个目标Activity的别名.至此我们已 ...