从.net Winform转到WPF已经有三个月的时间,对于WPF的开发也有了一点的基础。今天想和大家分享下WPF转换器的应用。
1、项目要求如下:在加载任务树的时候,根据树节点类型来加载多选一的节点。例如:车轮制造厂家(父节点):(A厂家-B厂家-C厂家)(子节点)。
这样多选一的情况,我采取了这样设置树结构:
1 <TreeView Background="Transparent" Grid.Column="0" Grid.Row="1" BorderThickness="1"
2 Margin="0" Name="treeView1">
3 <TreeView.ItemTemplate>
4 <HierarchicalDataTemplate ItemsSource="{Binding childNodeList}">
5 <Grid>
6 <StackPanel Width="Auto" Orientation="Horizontal">
7 <CheckBox x:Name="checkbox_choiceOne" Checked="checkbox_choiceOne_Checked" Tag="{Binding Guid}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="3"
8 Visibility="{Binding Path=AlternateField2,Converter={StaticResource checkBoxVisiable}}"
9 />
10 <Image Source="/Images/small.jpg" Width="7" Height="7"></Image>
11 <TextBlock HorizontalAlignment="Left" Width="Auto" Text="{Binding NodeTitle}" FontSize="16" FontWeight="Bold" Tag="Guid"
12
13 />
14 </StackPanel>
15 </Grid>
16 </HierarchicalDataTemplate>
17 </TreeView.ItemTemplate>
18 </TreeView>
1)CheckBox来处理多选一,属性若是选择性质,则显示此控件;否则不显示
2)Image充当树节点的小图标
3)TextBlock显示树节点文本
针对ChcekBox这种有显示条件的控件,需要给其设置转换器。涉及到显示与隐藏,所以用Visibility设置——
Visibility="{Binding Path=AlternateField2,Converter={StaticResource checkBoxVisiable}}"
其中“AlternaterField2”是节点表备用字段,在节点信息配置时候,用来保存节点是否需要多选一的属性——多选一则存1,否则存0。转换器是通过将这个字段值传递给转换器的类,用类中的方法来判断属性值,根据返回值来选择隐藏或显示这个CheckBox。
2、转换器类如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows;
6 using System.Windows.Data;
7 using System.Windows.Markup;
8
9 namespace Loteem.ProcessMonitorSystem.Common
10 {
11 public class IsChoiceToolConverter : MarkupExtension, IValueConverter
12 {
//此方法通用(无需修改)
13 public override object ProvideValue(IServiceProvider serviceProvider)
14 {
15 return this;
16 }
17 //此方法中value这个参数来接收AlternateField2传过来的值,方法体是对这个参数进行判断处理
//返回值要符合属性的特点Visibility=Visible/Hidden
18 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
19 {
20 if (value==null)
21 {
22 return Visibility.Hidden;
23 }
24 else
25 {
26 string val = value as string;
27 if (val.Equals("1"))
28 {
29 return Visibility.Visible;
30 }
31 else
32 {
33 return Visibility.Hidden;
34 }
35 }
36 }
37 //此方法中targetType来接收AlterField2字段的属性
38 public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
39 {
40 if (targetType != typeof(int))
41 throw new InvalidOperationException();
42 return false;
43 }
44 }
45 }
3、转换器如何引用?
如果是在代码逻辑层.cs层引用类我一般是先将类名以及点出来的方法名都写好,然后根据引用的小黄灯的提示,来添加引用。可是在界面设计层面,需要这样引用
<!--命名空间即类存放路径-->
xmlns:local="clr-namespace:Loteem.ProcessMonitorSystem.Common"
根据这个命名空间,可以发现类,用local加上冒号就可以发现转换器的类;然后x:key的命名来与CheckBox中Visibility="{Binding Path=AlternateField2,Converter={StaticResource checkBoxVisiable}}"的Converter名称相对应。
<Grid.Resources>
<ResourceDictionary>
<local:IsChoiceToolConverter x:Key="checkBoxVisiable"></local:IsChoiceToolConverter>
</ResourceDictionary>
</Grid.Resources>
以上是我对WPF转换器使用的整理,若有说的不妥当的地方,还请大侠们多多指点。