常用C#设计模式(上)
DP是coding中经常谈到的问题,虽然DP种类繁多,但是常用的DP不过几种,这里将浅析C#常用的设计模式。
【单例模式】
描述:最“简单”的设计模式,顾名思义,这个类型只有一个实例,不能创建其他实例。这个类型提供一个公共的访问点让用户操作这个实例。
例子:
1 | class Single |
DP是coding中经常谈到的问题,虽然DP种类繁多,但是常用的DP不过几种,这里将浅析C#常用的设计模式。
【单例模式】
描述:最“简单”的设计模式,顾名思义,这个类型只有一个实例,不能创建其他实例。这个类型提供一个公共的访问点让用户操作这个实例。
例子:
1 | class Single |
在WPF中,不论是ListBox,ListView或者DataGrid,在使用中都会经常用到SelectedItems,但是在Xaml中却发现SelectedItems没有办法Binding。这是因为SelectedItems是一个只读属性,且不是一个DependencyProperty,所以没法Binding。不过我们却可以通过以下几种方法来实现这个功能:
【方案一】
使用后台代码,读取这个控件的SelectedItems属性。例如
XAML:
1 | <ListView ItemsSource="{Binding}" x:Name="lvTest"> |
那么后台就可以
在使用SQLServer时,通常情况下使用SQLServer自带管理器可以查看到数据变更的记录。如果在程序用需要更灵活的记录这些信息,则可以通过EF的ObjectStateManager属性的相关方法实现。
ObjectStateManager.GetObjectStateEntries 方法
返回具有给定状态的对象或关系的 ObjectStateEntry 对象的集合。
命名空间: System.Data.Objects
程序集: System.Data.Entity(在 System.Data.Entity.dll 中)
使用EF框架并在在ListView或ListBox中binding了数据源,每一行数据都对应一个删除按钮,点击这个按钮就删除对应的那条数据。
看似简单的功能也能玩出新花样,下面提供两种方案:
【方案一】
1 | <ListBox FontSize="20" SelectionMode="Single" ItemsSource="{Binding XX}" > |
1 | public void Del(object sender, RoutedEventArgs e) |
在VS2012之前的版本中,如果要使用remote debug需要注意一下几种情况:
这些条件使得VS远程调试变得非常麻烦,但是从VS2012开始,远程调试功能有了改善,下面介绍一下VS2012或VS2013使用“无身份验证”模式进行远程调试的方法。(以VS2013为例)
1.进入VS安装目录,按如下路径找到Remote Debugger文件夹
\Microsoft Visual Studio 12.0\Common7\IDE\Remote Debugger
初学WPF的新人有时都会对StaticResource和DynamicResource的概念及应用朦朦胧胧,这里通过一个小例子彻底弄懂这两者的区别及用法。
首先是前台XAML:
1 | <Window x:Class="WpfApplication50.MainWindow" |
后台的代码:
1 | private void Button_Click(object sender, RoutedEventArgs e) |
有需求要根据某变量的值将ListView中GridView的某一个GridViewColumn做隐藏设置,经过一番思考,总结了两种方法,但都需要对ListView中的GridView以及每一个GridViewColumn做命名:
1 | <ListView x:Name="lvTest" SelectionMode="Single"> |
这种方法相对简单,如果没有特殊条件限制,可以直接设置某一列的width=0
,如:
gvcName.Width = 0
jekyll-lunr-js-search是一款适用于Jekyll的站内搜索插件,相关介绍和使用方法在github中已经有简单说明,不过我却在使用这个插件上耽误了很多时间,现在整理一番:
1.clone “jekyll-lunr-js-search”到本地
2.将clone后的jekyll-lunr-js-search项目中的
build/jekyll_lunr_js_search.rb
在WPF中若使用多个控件,并给这些控件添加同一个ContextMenu,那么如何获取ContextMenu的鼠标点击源?
WPF的ContextMenu并没有Winform的ContextMenu的SourceControl这一属性,但我们也可以通过另一种方法实现同样的功能。
在ContextMenu的MenuItem的点击事件中使用ContextMenu.PlacementTarget
1 | public void MenuItem_Click(object sender, RoutedEventArgs e) |
在使用EF删除一对多关系的实体时,碰到如下提示:
“其他信息: 操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null。对关系作出更改后,会将相关的外键属性设置为 null 值。如果外键不支持 null 值,则必须定义新的关系,必须向外键属性分配另一个非 null 值,或必须删除无关的对象。”
原因很简单,假设一个A对应多个B,那么B中的外键就是A的主键,如果先删除A,接着又把B读取到datacontext中
var lstB = a.B.ToList();
container.A.DeleteObject(a);
就会导致B中的外键失去关联,所以便产生了错误,解决的办法有下面几种: