前言: 说到WPF ,我想每个使用它的人都不可能不知道他的绑定,区别于Winform的托拉拽,wpf在xaml里编写界面,在cs文件里编写代码,实现MVVM,这是WPF开发相较于winform的绝对优势。
而wpf关于UI更新的绑定也几乎是面试中必被提及的问题之一,根据本人的经验,你回答的深度直接决定了你的工作经验的厚重度。
一·面试官:你对wpf应该比较熟悉了是吧,那么请你讲一下wpf里UI更新是怎么实现的? 一般针对这个问题没有直接问你绑定的话面试官是希望你能自己去说出绑定,同时也想听听看除了绑定你还有没有其他的方法(MVVM模式和非MVVM模式,最好我们都给回答一下)。
答:
1.界面更新有很多种方法,简单点的话,如果界面没有做MVVM的话,我们可以使用单例模式对界面进行更新
首先,对于界面的View在他对应的View.cs文件的Initialize初始化方法里,我们给定一个实例的委托赋值,Instance = ViewName这样的形式,将我们的单例委托成当前的View界面,他是static静态的,所以我们在其他cs代码里面可以使用 View.Instance.控件.属性 = xxx的形式直接进行更新,如果这段代码是放在非UI线程当中,那我们还需要通过View.Instance.Dispatch.Invoke(同步执行)或者 View.Instance.Dispatch.BeginInvoke(异步执行)的方式对UI进行更新
2.MVVM模式下使用绑定进行UI更新,即UI里View.xaml里的布局代码中我们对需要实时更新的UI控件的属性进行绑定,在他对应ViewModel里定义这个字段,当我们需要更新UI时,只需要对我们ViewModel里绑定的这个字段值进行修改,就能实现UI的更新。
二·面试官:你刚刚说到了绑定是吧,那具体的绑定是如何做的,他是怎么通知到界面上的? 这个问题主要就是考我们对绑定的熟悉程度,我们需要回答到的点主要就是IPropertychanged这个关键词,一般这个点只要说清楚了,基本面试官会觉得你算得上一个有经验的WPF开发。
答:
1.绑定的话一般情况原生的情况我需要给需要实现绑定的属性所在的类继承IPropertychanged基类,对应的属性有获取器get和设置器set,在对应的属性设置器里我们需要实现Onpropertychanged(“属性名”)的调用,界面所对应的更新是通过Onpropertychanged方法去实现通知的,这个方法是原生的写法。
2.在实际开发中我更倾向于使用Propertychanged.Fody这个Nuget库,他的使用非常方便,只需要在类的标头添加AddNotyfyPropertyChanged这个特性,在内部他已经帮我们实现了第一种方法里面的属性通知,并且它是轻量级的,能帮我们减少大量的代码。
面试官:很好很好,你被录取了(//滑稽)
这个问题基本上是中级必问,回答的时候我们不仅要知道他原生的写法是什么,也要知道推荐的方便开发的写法,这样面试官才会觉得你的技术有一定的扎实性,当然了面试不过是检验理论,最重要的一定还是实践,希望每个人都能在实践中产出更高的真知!(//peace)