原文:用MVVM模式开发中遇到的零散问题总结(2)

本节目录

1.解决动画属性被劫持问题

2.设置页面焦点默认所在对象

3.XAML模拟键盘按键

4.DataGrid数据源绑定到复杂格式(dynamic类的运用)

本系列文章快速导航:

用MVVM模式开发中遇到的零散问题总结(1)

1.解决动画属性被劫持问题 


  这个问题解决的方案比较多,这里我就说最适用的方法 

案例如下:

<Transform3DGroup>                            
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="roll" Axis="0,1,0" Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>

当我们用roll.BeginAnimation()执行动画后

roll.Angle = ;

将不起任何作用,roll.Angle一直保持动画结束后的值,我们需要在执行赋值之前解除对Angle属性的劫持

roll.BeginAnimation(AxisAngleRotation3D.AngleProperty, null);
roll.Angle = ;

这样就OK了。

其他的解决方法请看这位大侠博文http://www.cnblogs.com/alamiye010/archive/2009/08/26/1554539.html 讲的比MSDN还全....

2.设置页面焦点默认所在对象


  我这里是要设置窗口的默认焦点,像winForm一样设置TabIndex=0已经无用了,这里是用Command把要设置焦点的对象传到了ViewModel,然后再执行Focus()来设置焦点,传递父对象用到了RelativeSource源 ,但是还是有个缺点,必须设定父对象的类型才能成功绑定,求方案...

view如下:

<TextBox TabIndex="0">
<i:Interaction.Triggers>
<i:EventTrigger>
<i:InvokeCommandAction Command="{Binding setFocus}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>

viewModel:

      public ICommand setFocus { get; set; }
public void setFocusMethod(TextBox control)
        {
            control.Focus();
            control.SelectionStart = control.Text.Length;//光标定位到末尾
        }

更多关于RelativeSource的知识,请参考:http://www.cnblogs.com/iwteih/archive/2010/02/03/1662891.html

这里我请教个问题:我要把Label的内容绑定到但前的系统时间,应该如何做呢?

<Label Margin="0,8,8,16.163"DataContext="{Binding Source={StaticResource DateTimeDataSource}}" Content="{Binding Now, Mode=OneWay}" />

这样使用时间是不会更新的,我也试过用timerEvent事件来触发绑定还是没用,求解释,当然了只能用XAML来实现。

更新:我已经解决了,用英文在google搜索了老外问的相同问题,原来DateTime.Now是静态资源的,它的更新,不会触发OnPropertyChanged通知到界面,所以只用Xaml来实现是不可能滴。我的解决方案如下:

ViewModel:

 private void initCommand()
{  
            System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds();
timer.Tick+=new EventHandler(timer_Tick);
timer.Start();
}

private void timer_Tick(object sender, EventArgs e)
{
OnPropertyChanged("timeNow");
}
public string timeNow { get { return DateTime.Now.ToString("   hh:mm:ss\r\nyyyy-M-d "); } }

View:

<Label Content="{Binding timeNow,Mode=OneWay}"/>    

这样就实时更新了。关于时间的显示格式请参考:

http://msdn.microsoft.com/zh-cn/library/8kb3ddd4(v=VS.100).aspx

3.XAML模拟键盘按键


这里调用的是System.Windows.Forms.SendKeys.SendWait(str)方法,需要引用System.Windows.Forms.dll

str:为键值字符串代码。参考:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.sendkeys.aspx

你会发现字符串都是{TAB}、{LEFT}这种格式的,但是在XAML中我们{}是有特殊意义的,比如{Binding}

但是XAML还是留给了我们转义符,比如:

我们要给correctInput(string str)方法传递"{BS}"字符串

前台:

<Button Content="回删" CommandParameter="{}{BS}" Command="{Binding correctInput}"/>

在字符串的前面加上{}就可以转意了哦~~~

后台:

    public ICommand correctInput { get; set; }
public void correctInputMethod(string str)
{
try
{

win.win.Dispatcher.Invoke(new Action(() =>
{
System.Windows.Forms.SendKeys.SendWait(str);//直接发送backspace按键消息
}));
}
catch (Exception exp)
{
errerLog(exp);
}
FireEventMethod("correctInputMethod");
}

此方法只能模拟键盘按键哦。鼠标的没用到,暂时没研究,有知道的兄弟告诉下

4.DataGrid数据源绑定到复杂格式(dynamic类的运用)


  这节标题我都不知道该怎么取,因为情况的确够复杂的,就把我的情况说下,大家以后遇到这种问题可以向这个方面考虑。

  我view上有一个DataGrid,由于事先商定WCF传的数据都是以dictionary<string,object>来传的,即数据传过来是这种形式的dictionary<string,dictionary<string,string>>,其中第一层的dictionary的每一项就是datagrid的一行,而里面那层的dictionary的key就是列名,value就是值,当然了每次传的数据列名也可能不一样,目的就是让这个数据显示在DataGrid上。要如何绑定呢?我对DataGrid研究不是很深,我只知道可以绑定到XML和List<T>型的数据集合上。而这个数据源应该具有通用性,所以T的类型也是不确定的。

  说了这么多应该把情况说清楚了,下面该主角出场了:dynamic 类。这个类是可编译时动态添加它的属性和方法,具体介绍:http://msdn.microsoft.com/zh-cn/library/dd264741.aspx

  遍历字典,然后根据列名动态添加dynamic实例的属性,并赋值。每完一行就添加到一个ObservableCollection<dynamic>对象中,这样就符合list<T>这种型式的数据结构了,可供DataGrid使用。

private ObservableCollection<ObservableCollection<dynamic>> _colDic;
/// <summary>
/// 集合型数据字典集合
/// </summary>
public ObservableCollection<ObservableCollection<dynamic>> colDic
{
get { return _colDic; }
set
{
_colDic = value;
OnPropertyChanged("colDic");//更新到界面
}
}

public void dicToColMethod(Dictionary<string, object> dic)
{
win.win.Dispatcher.Invoke(new Action(() =>
{
ObservableCollection<dynamic> items = new ObservableCollection<dynamic>();//
colDic.Add(new ObservableCollection<dynamic>());//向集合字典添加第一本字典
int dicNem = ;//记录第几本字典
int k = ;//记录是第几条数据
foreach (string i in dic.Keys)
{
//整个dataGrid绑定到的数据源
Dictionary<string, object> thisDic;
if (dic[i].GetType().Name.Contains("Dictionary"))
{
dynamic item = new ExpandoObject();
thisDic = dic[i] as Dictionary<string, object>;
foreach (string j in thisDic.Keys)
{
(item as IDictionary<string, object>).Add(j, thisDic[j]);
}
items.Add(item);
}
if (k % + == )//每10行做一页
{
items = new ObservableCollection<dynamic>();//
colDic.Add(new ObservableCollection<dynamic>());
dicNem++;
}
if (k % + == || k == dic.Keys.Count - )
colDic[dicNem] = items;
k++;
}
}));
}

XAML:

<DataGrid ItemsSource="{Binding colDic[1]}" FontSize="15" Margin="11.5,8,40,8" SelectionMode="Single" IsReadOnly="True" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<DataGrid.Columns>
<DataGridTextColumn Header="支付日期" Width="80" Binding="{Binding PayDate}"/>
<DataGridTextColumn Header="支付时间" Width="80" Binding="{Binding PayTime}"/>
<DataGridTextColumn Header="支付渠道" Width="160" Binding="{Binding PayChannel}"/>

</DataGrid.Columns>
</DataGrid>

  因为界面里用了一个书本翻页的控件,所以Datagrid分页也必须创建多个Datagrid来绑定到每10页一个的ObservableCollection。这些不是重点了,重点是介绍了dynamic的牛X之处。

后记:


  我的第一个MVVM实战项目也是我工作以来的第一个项目昨天结束了,虽然结果有点不尽人意,但也从中学到不少。MVVM的设计模式是我引进到公司,却只有我一人用,所以3层都由我来写,2个星期的时间,面对view的不断需求不断更新加上自助终端上的那配置...我表示压力很大,这也就是成长的一部分吧。这个系列的文章可能让人感觉莫不着头脑,但是这些都是我遇到的问题,各位可以收藏起来,说不定哪天就碰到和我一样的问题呢,o(∩_∩)o 哈哈~~马上又要进入到另外一个项目了,只要我在学习,这系列文章就会不断更新,因为我发现,要把解决问题的方法转换成经验最好的方法就是把它共享出来,这样可以N长时间后也能看懂自己写的什么。

用MVVM模式开发中遇到的零散问题总结(2)的更多相关文章

  1. 用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件

    原文:用MVVM模式开发中遇到的零散问题总结(4)--自制摄像头拍摄大头贴控件 一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种Code ...

  2. 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机

    原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...

  3. 用MVVM模式开发中遇到的零散问题总结(3)——自制正则表达式万能绑定转换器

    原文:用MVVM模式开发中遇到的零散问题总结(3)--自制正则表达式万能绑定转换器 前言 最近接受了3个项目的洗礼,出差近3个月,各种北京.广州.昆明来回奔波,好久没写博客了,之前我觉得我遇到的问题都 ...

  4. 用MVVM模式开发中遇到的零散问题总结(1)

    https://www.cnblogs.com/tong-tong/archive/2011/11/28/2250948.html

  5. 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法

    实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...

  6. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

  7. C# WPF开发之MVVM模式开发

    MVVM模式由Model,View,ViewModel三部分组成. Model需继承INotifyPropertyChange(属性修改通知) ViewModel负责业务逻辑,连接View和Model ...

  8. Android 基于MVC的MVVM模式开发

    由skay整理  http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...

  9. 简易的WPF MVVM模式开发

    Model层 public class Song { private string _artistName; private string _songTitle; public string Song ...

随机推荐

  1. 独立博客网站FansUnion.cn运营2年的经验和教训以及未来规划

    今天,我把运营了2年的独立博客网站FansUnion给"归零"了.    2012年6月,我成功搭建了自己的博客网站FansUnion.cn,这是由于自己的不懈努力和时代发展成就的 ...

  2. Freemarker宏和函数的用法和区别

    1.宏(macro) 写法:<#macro page url page maskSize=5>    <#if (number == pages)> <li>< ...

  3. [React] Render Basic SVG Components in React

    React loves svg just as much as it loves html. In this lesson we cover how simple it is to make SVG ...

  4. 【vs调试】PDB 文件:每个开发人员都必须知道的

    [vs调试]PDB文件:每个开发人员都必须知道的 GDB:The GNU Project Debugger, 将会包含代码中符号(自定义变量, 数据类型), 还有函数调用或类引用的关联性, 有了pdb ...

  5. 我的Java开发学习之旅------&gt;Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...

  6. layer弹框在实际项目中的一些应用

    官方介绍:layer至今仍作为layui的代表作,受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,l ...

  7. 【t012】整理书架

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 小明是一个非常喜欢读书的孩子,他有一个特别的书架,书架上摆放着他买的新书.当他决定要阅读某本图书时,他就 ...

  8. elasticsearch start

    启动.停止服务 默认官方版启动: linux:./bin/elasticsearch start window:直接运行bin/elasticsearch.bat 默认官方版停止: linux:kil ...

  9. 一个2013届毕业生(踏上IT行业)的迷茫(2)

    初中的时光是一段艰辛,但幸福的时光,在这一段时光中同样我遇到了我人生中第二个贵人.记得在小学毕业的那个暑假里,我知道上了初中会开一门叫做英语的课程,那时候在我们那里有好多上过初中.高中的在我们小学开英 ...

  10. webpack优化经验1(持续)

    1 不知道该优化哪里 先开启gzip压缩,这样可以很直接的减少请求包的体积,效果显著,不过需要在服务器端作相应的配置才能生效 2拆分vendor包, 减少单体包的体积,并行加载 通过配置,将不同的公用 ...