从.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转换器使用的整理,若有说的不妥当的地方,还请大侠们多多指点。