应用场景

我想把View层的一个布局控件和功能按钮传到ViewModel层,达到动态变更布局,同时灵活获取功能按钮的属性,让View和ViewModel完全分离,而不受View层影响。

最后我想到使用IMultiValueConverter实现多参传入ViewModel层来解决,不知道还有没有更好的办法?

基本原理:要将值转换器与 MultiBinding 关联,请创建一个实现 IMultiValueConverter 接口的类,然后实现 Convert 和 ConvertBack 方法。
集合中的各个绑定可以具有自己的值转换器。

使用 MultiBinding,您可以将绑定目标属性绑定到源属性列表,然后应用逻辑以使用给定的输入生成值。

实现步骤

    添加继承IMultiValueConverter接口的类并实现接口

    注意:返回的values一定要转为数组列表values.ToArray()

参考如下代码

using System;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes; namespace TLAgent.SecurityManager.WPF.MultiBindings
{
public class DataConverter : IMultiValueConverter
{
#region IMultiValueConverter Members public object Convert(object[] values, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
return values.ToArray() ;
} public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
} #endregion
}
}

在XAML中进行多参绑定

<Fluent:Button Header="添加用户" Icon="Images\Green.png" LargeIcon="Images\GreenLarge.png" x:Name="BtnAddUser" Command="{Binding AddUserCommand}">
<Fluent:Button.CommandParameter>
<MultiBinding Converter="{ StaticResource ResourceKey=dataConverter}" Mode="TwoWay">
<MultiBinding.Bindings>
<Binding ElementName="BtnAddUser"/>
<Binding ElementName="dockManager "/>
</MultiBinding.Bindings>
</MultiBinding>
</Fluent:Button.CommandParameter> </Fluent:Button>
<Window.Resources>
<local:DataConverter x:Key="dataConverter"/>
</Window.Resources>

ViewModel中进行命令和方法绑定

注意:DelegateCommand<object[]>的参数是要支持对象数组。

using System;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Input;
using Microsoft.Practices.Prism.Commands;
using Microsoft.Practices.Prism.ViewModel;
using Xceed.Wpf.AvalonDock;
using Xceed.Wpf.AvalonDock.Layout;
using Application = System.Windows.Application;
using MessageBox = System.Windows.MessageBox;
using UserControl = System.Windows.Controls.UserControl; namespace TLAgent.SecurityManager.WPF.ViewModels
{
public class MainWindowViewModel : NotificationObject
{
public ICommand ExitSystemCommand { get; set; } public ICommand AddUserCommand { get; set; } public ICommand OpenHelpCommand { get; set; } public MainWindowViewModel()
{
ExitSystemCommand = new DelegateCommand(this.OnExit);
OpenHelpCommand = new DelegateCommand(this.OnOpenSupport);
AddUserCommand = new DelegateCommand<object[]>(this.AddUser);
} private void CreateTab(DockingManager dockManager, string tabName, UserControl control)
{
var firstDocumentPane = dockManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault();
if (firstDocumentPane != null)
{
LayoutDocument doc2 = new LayoutDocument();
doc2.Title = tabName;
doc2.Content = control;
doc2.IsActive = true;
firstDocumentPane.Children.Add(doc2);
}
} private void OnExit()
{
MessageBoxResult result = MessageBox.Show("确定要退出系统吗?", "确认消息", MessageBoxButton.OKCancel, MessageBoxImage.Question);
if (result == MessageBoxResult.OK)
{
Application.Current.Shutdown();
}
} private void OnOpenSupport()
{
MessageBox.Show("帮助窗口!");
} private void AddUser(object[] objParam)
{
if (objParam.Length == 2)
{
Fluent.Button button = (Fluent.Button)objParam[0];
DockingManager dockingManager = (DockingManager)objParam[1];
UserControl control;
control = new UserControl1(); CreateTab(dockingManager, button.Header.ToString(), control);
}
}
}
}

控件绑定

这样就可以在方法AddUer的参数中取得View层绑定的两个控件:

<MultiBinding.Bindings>
<Binding ElementName="BtnAddUser"/>
<Binding ElementName="dockManager "/>
</MultiBinding.Bindings>

这样基本就实现了从View层传多个对象到ViewModel层了。

基于WPF系统框架设计(9)-多值绑定之IMultiValueConverter的更多相关文章

  1. 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

    AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...

  2. 基于WPF系统框架设计(1)-为什么要仿Office2010 Ribbon?

    为什么系统框架设计使用Ribbon导航模式? 这得从Office软件的演变说起.微软为什么最后选择使用Ribbon,也许就是很多系统设计要使用Ribbon做功能导航的原因. 你是否还记得曾经使用过的M ...

  3. 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)

    前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...

  4. 基于WPF系统框架设计(3)-Fluent Ribbon界面布局

    一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...

  5. 基于WPF系统框架设计(6)-整合MVVM框架(Prism)

    应用场景 我们基础的框架已经搭建起来了,现在整合MVVM框架Prism,在ViewModel做一些逻辑处理,真正把界面设计分离出来. 这样方便我们系统开发分工合作,同时提高系统可维护性和灵活性. 具体 ...

  6. 基于WPF系统框架设计(2)-Fluent Ribbon之HelloWorld

    Fluent/Ribbon是微软在其最新桌面操作系统Windows 7中使用的图形用户界面. Windows平台的进化,伴随着系统图形界面的重新设计.从Windows XP到Windows Vista ...

  7. 基于WPF系统框架设计(8)-PasswordBox传值到ViewMode

    应用场景 我要做一个系统登录功能,需要传用户名和密码到ViewModel中,可是PasswordBox传值到ViewModel中好像跟TextBox等控件不一样.这里需要用到附加属性. 附加属性:一个 ...

  8. 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令

    应用场景 我现在做一个系统登录功能,要求在PasswordBox上输完密码后回车,能够响应Enter事件,并执行ViewModel中对应的方法.如果登录成功则隐藏当前窗口显示主窗体,登录失败则焦点返回 ...

  9. 基于WPF系统框架设计(10)-分页控件设计

    背景 最近要求项目组成员开发一个通用的分页组件,要求是这个组件简单易用,通用性,兼容现有框架MVVM模式,可是最后给我提交的成果勉强能够用,却欠少灵活性和框架兼容性. 设计的基本思想 传入数据源,总页 ...

随机推荐

  1. GBDT算法简述

    提升决策树GBDT 梯度提升决策树算法是近年来被提及较多的一个算法,这主要得益于其算法的性能,以及该算法在各类数据挖掘以及机器学习比赛中的卓越表现,有很多人对GBDT算法进行了开源代码的开发,比较火的 ...

  2. 创建OpenStack的存储云

    OPENSTACK内部 OpenStack是一个开源的云平台项目,是由NASA发起,Rackspace在2010作为一个项目进行主导.源代码是由OpenStack基金会管理并在准许Apache许可下发 ...

  3. 使用 SceneLoader 类在 XNA 中显示载入屏幕(十)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  4. 如何选择Android自动化框架的几点拙见

    首先由于我自己也是个新手,也是在学习各种框架然后给公司项目选定相应自动化框架,研究移动自动化测试框架也就近段时间而已,所以我只能从我自己今天为止的认知角度给各个框架抒发我自己的拙见,你看是否能从中接纳 ...

  5. [python][django学习篇][9]设计正在博客视图(3)

    需求: 真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样.t https://docs.djangoproject.com/en/1.10/ ...

  6. idea中将项目与github关联

    © 版权声明:本文为博主原创文章,转载请注明出处 1.在github中创建一个账号:https://github.com/join?source=header-home 2.下载并安装git:http ...

  7. RNQOJ Jam的计数法

    题目:https://www.rqnoj.cn/problem/3 非递归做法:(严格递增 单调大于 不可等于  ) 做法:循环体 <1>操作字符串 str 从后往前找,k=1,如果s[w ...

  8. tail /grep/more

    1.tail -f 文件名 不断的刷新日志信息,实时的得到新追加到文件中的信息,常用来跟踪日志文件,如tail -f err.log Ctrl+C退出 2.grep '内容' 文件名 3.more 分 ...

  9. 【bzoj4668】冷战 并查集按秩合并+朴素LCA

    题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...

  10. 文本文件txt生成excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...