WPF绑定出现异常,绑定可以设置条件吗?

Zhang_Yunan 电子科技大学 C#开发工程师  2014-02-10 04:22:07
运行出来的图:

列“实时报警”的XAML为:
<DataGridTemplateColumn Header="实时报警">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<WrapPanel Visibility="{Binding Path=Category, Converter={StaticResource armingProperty2VisibilityConverter}}">
<RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked"
IsChecked="{Binding Path=ArmingPropertyPro,
Converter={StaticResource armingProperty2BoolConverter},
Mode=OneTime}"/>
<RadioButton x:Name="radTurnOff" Content="关" Checked="radTurnOff_Checked"
IsChecked="{Binding Path=ArmingPropertyPro,
Converter={StaticResource armingProperty2BoolReverseConverter},
Mode=OneTime/>
</WrapPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

在DataGrid中Binding后台数据。
<DataGrid ItemsSource="{Binding ElementName=nodesSetCtrl, Path=NodeList}"/>

NodeList的定义是:
public ObservableCollection<Node> NodeList

这是一个Node的集合,有些是Node类本身,有些是继承自Node的AlarmCatagoryNode类。例如图中的1、2、3、7、11、12就是AlarmCatagoryNode类。只有AlarmCatagoryNode类会显示“实时报警”。

其余的21-6=15行不显示。但是会出现绑定异常:
System.Windows.Data Error: 40 : BindingExpression path error: 'ArmingPropertyPro' property not found on 'object' '
'Node' (HashCode=20106484)'. BindingExpression:Path=ArmingPropertyPro; DataItem='Node' (HashCode=20106484);
target element is 'RadioButton' (Name='radTurnOn'); target property is 'IsChecked' (type 'Nullable`1')

意思是在Node对象上找不到ArmingPropertyPro属性
这种异常的个数正好是15个。出现这种异常理所当然,Node类中本来就没有ArmingPropertyPro属性,只是在他的子类AlarmCatagoryNode中才有,而这15个不是AlarmCatagoryNode,因此出现这种异常。


我的问题是:可不可以设置条件,在绑定的类是AlarmCatagoryNode时才绑定,对于普通的Node不进行绑定,从而避免这种异常。
单纯的处理这种异常的办法也欢迎提出来!

在下先谢谢了
...全文
205 点赞 收藏 15
写回复
15 条回复
Bonjour-你好 2014年02月11日
引用 5 楼 YUNAN_ZHANG 的回复:
人呢 在线等你回答问题
还没上班,起床比较晚 我上面的意思是,让报警列直接绑定节点类:
<RadioButton x:Name="radTurnOn" Content="开" IsChecked="{Binding Mode=OneTime,Converter={StaticResource armingProperty2BoolReverseConverter}}"/>
然后在Converter里面就可以判断了:
AlarmCatagoryNode temp = value as AlarmCatagoryNode;
if (temp != null) {
    //
}
回复 点赞
exception92 2014年02月11日
引用 10 楼 YUNAN_ZHANG 的回复:
[quote=引用 9 楼 duanzi_peng 的回复:] [quote=引用 8 楼 duanzi_peng 的回复:] [quote=引用 7 楼 YUNAN_ZHANG 的回复:] [quote=引用 6 楼 duanzi_peng 的回复:] IsChecked属性绑定一个转换类,类里边做逻辑处理。什么时候选中,什么时候不选中。 至于显示的话可以再绑定一个转换类。意思跟上边的差不多。
<WrapPanel Visibility="{Binding Path=Category, 
                                Converter={StaticResource armingProperty2VisibilityConverter}}">
           <RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolConverter}, Mode=OneTime}"/>
           <RadioButton x:Name="radTurnOff" Content="关" Checked="radTurnOff_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolReverseConverter},Mode=OneTime/>
</WrapPanel>
我就是这样做的啊:IsChecked属性绑定转换类——ArmingProperty2BoolConverter 显示绑定转换类——ArmingProperty2VisibilityConverter 这就是两个装换类啊? 你的意思是怎么绑定?[/quote] 你这样逻辑不正确吧?? Node类中本来就没有ArmingPropertyPro属性,你的集合是ObservableCollection<Node>,你怎么绑定也绑定不上的。[/quote] 你也可以converter一下Path, Path={bing} 在Converter类里: if((object as AlarmCatagoryNode)==null){ return null; } else { // 判断有没有那个属性 再返回。 return ArmingPropertyPro; } 我感觉是这样。[/quote] 呵呵。。。。。。。 出现了这个错误:好拗口啊:) Binding不能嵌套吧? [/quote]
回复 点赞
Zhang_Yunan 2014年02月11日
引用 9 楼 duanzi_peng 的回复:
[quote=引用 8 楼 duanzi_peng 的回复:]
[quote=引用 7 楼 YUNAN_ZHANG 的回复:]
[quote=引用 6 楼 duanzi_peng 的回复:]
IsChecked属性绑定一个转换类,类里边做逻辑处理。什么时候选中,什么时候不选中。
至于显示的话可以再绑定一个转换类。意思跟上边的差不多。


<WrapPanel Visibility="{Binding Path=Category, 
Converter={StaticResource armingProperty2VisibilityConverter}}">
<RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked"
IsChecked="{Binding Path=ArmingPropertyPro,
Converter={StaticResource armingProperty2BoolConverter}, Mode=OneTime}"/>
<RadioButton x:Name="radTurnOff" Content="关" Checked="radTurnOff_Checked"
IsChecked="{Binding Path=ArmingPropertyPro,
Converter={StaticResource armingProperty2BoolReverseConverter},Mode=OneTime/>
</WrapPanel>

我就是这样做的啊:IsChecked属性绑定转换类——ArmingProperty2BoolConverter
显示绑定转换类——ArmingProperty2VisibilityConverter
这就是两个装换类啊?
你的意思是怎么绑定?[/quote]
你这样逻辑不正确吧?? Node类中本来就没有ArmingPropertyPro属性,你的集合是ObservableCollection<Node>,你怎么绑定也绑定不上的。[/quote]
你也可以converter一下Path, Path={bing}
在Converter类里:
if((object as AlarmCatagoryNode)==null){
return null;
}
else
{
// 判断有没有那个属性 再返回。
return ArmingPropertyPro;
}

我感觉是这样。[/quote]

呵呵。。。。。。。
出现了这个错误:好拗口啊:)

Binding不能嵌套吧?
回复 点赞
exception92 2014年02月11日
引用 8 楼 duanzi_peng 的回复:
[quote=引用 7 楼 YUNAN_ZHANG 的回复:] [quote=引用 6 楼 duanzi_peng 的回复:] IsChecked属性绑定一个转换类,类里边做逻辑处理。什么时候选中,什么时候不选中。 至于显示的话可以再绑定一个转换类。意思跟上边的差不多。
<WrapPanel Visibility="{Binding Path=Category, 
                                Converter={StaticResource armingProperty2VisibilityConverter}}">
           <RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolConverter}, Mode=OneTime}"/>
           <RadioButton x:Name="radTurnOff" Content="关" Checked="radTurnOff_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolReverseConverter},Mode=OneTime/>
</WrapPanel>
我就是这样做的啊:IsChecked属性绑定转换类——ArmingProperty2BoolConverter 显示绑定转换类——ArmingProperty2VisibilityConverter 这就是两个装换类啊? 你的意思是怎么绑定?[/quote] 你这样逻辑不正确吧?? Node类中本来就没有ArmingPropertyPro属性,你的集合是ObservableCollection<Node>,你怎么绑定也绑定不上的。[/quote] 你也可以converter一下Path, Path={bing} 在Converter类里: if((object as AlarmCatagoryNode)==null){ return null; } else { // 判断有没有那个属性 再返回。 return ArmingPropertyPro; } 我感觉是这样。
回复 点赞
exception92 2014年02月11日
引用 7 楼 YUNAN_ZHANG 的回复:
[quote=引用 6 楼 duanzi_peng 的回复:] IsChecked属性绑定一个转换类,类里边做逻辑处理。什么时候选中,什么时候不选中。 至于显示的话可以再绑定一个转换类。意思跟上边的差不多。
<WrapPanel Visibility="{Binding Path=Category, 
                                Converter={StaticResource armingProperty2VisibilityConverter}}">
           <RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolConverter}, Mode=OneTime}"/>
           <RadioButton x:Name="radTurnOff" Content="关" Checked="radTurnOff_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolReverseConverter},Mode=OneTime/>
</WrapPanel>
我就是这样做的啊:IsChecked属性绑定转换类——ArmingProperty2BoolConverter 显示绑定转换类——ArmingProperty2VisibilityConverter 这就是两个装换类啊? 你的意思是怎么绑定?[/quote] 你这样逻辑不正确吧?? Node类中本来就没有ArmingPropertyPro属性,你的集合是ObservableCollection<Node>,你怎么绑定也绑定不上的。
回复 点赞
Zhang_Yunan 2014年02月11日
引用 6 楼 duanzi_peng 的回复:
IsChecked属性绑定一个转换类,类里边做逻辑处理。什么时候选中,什么时候不选中。 至于显示的话可以再绑定一个转换类。意思跟上边的差不多。
<WrapPanel Visibility="{Binding Path=Category, 
                                Converter={StaticResource armingProperty2VisibilityConverter}}">
           <RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolConverter}, Mode=OneTime}"/>
           <RadioButton x:Name="radTurnOff" Content="关" Checked="radTurnOff_Checked" 
                        IsChecked="{Binding Path=ArmingPropertyPro, 
                        Converter={StaticResource armingProperty2BoolReverseConverter},Mode=OneTime/>
</WrapPanel>
我就是这样做的啊:IsChecked属性绑定转换类——ArmingProperty2BoolConverter 显示绑定转换类——ArmingProperty2VisibilityConverter 这就是两个装换类啊? 你的意思是怎么绑定?
回复 点赞
exception92 2014年02月11日
IsChecked属性绑定一个转换类,类里边做逻辑处理。什么时候选中,什么时候不选中。 至于显示的话可以再绑定一个转换类。意思跟上边的差不多。
回复 点赞
Zhang_Yunan 2014年02月11日
引用 2 楼 KumaPower 的回复:
忘了,应该可以直接Binding它自己本身,这样你在Converter里面就可以判断这个Node类是否是AlarmCatagoryNode类。
人呢 在线等你回答问题
回复 点赞
exception92 2014年02月11日
引用 14 楼 YUNAN_ZHANG 的回复:
谢谢 KumaPower 同样给duanzi_peng 结贴,给分。
学习了。可以不绑定path,直接绑定Converter.谢 KumaPower
回复 点赞
Zhang_Yunan 2014年02月11日
谢谢 KumaPower 同样给duanzi_peng 结贴,给分。
回复 点赞
Zhang_Yunan 2014年02月11日
引用 12 楼 KumaPower 的回复:
还没上班,起床比较晚 我上面的意思是,让报警列直接绑定节点类:
<RadioButton x:Name="radTurnOn" Content="开" IsChecked="{Binding Mode=OneTime,Converter={StaticResource armingProperty2BoolReverseConverter}}"/>
然后在Converter里面就可以判断了:
AlarmCatagoryNode temp = value as AlarmCatagoryNode;
if (temp != null) {
    //
}
就是这样!这种方法可行。 我是按照如下解决的 RadioButton的绑定去掉了Path=ArmingPropertyPro,

<RadioButton x:Name="radTurnOn" Content="开" Checked="radTurnOn_Checked" IsChecked="{Binding Converter={StaticResource armingProperty2BoolConverter}, Mode=OneTime}"/>
然后在Converter中这样处理:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Nodes.AlarmCatagoryNode tempNode = value as Nodes.AlarmCatagoryNode;
            if (tempNode != null)
            {
                if (tempNode.ArmingPropertyPro == ArmingProperty.永久布防)
                {
                    return true;
                }
                else if (tempNode.ArmingPropertyPro == ArmingProperty.默认属性)
                {
                    return false;
                }
                else
                {
                    throw new Exception("布防属性,收到未知值!");
                }
            }
            else
            {
                return null;
            }
        }
回复 点赞
Zhang_Yunan 2014年02月10日
引用 2 楼 KumaPower 的回复:
忘了,应该可以直接Binding它自己本身,这样你在Converter里面就可以判断这个Node类是否是AlarmCatagoryNode类。
RadioButton的IsChecked属性绑定的是NodeList的ArmingPropertyPro属性。 这时我需要的。 绑定到RadioButton的Self吗,Self里面没有数据啊?
回复 点赞
Zhang_Yunan 2014年02月10日
引用 1 楼 KumaPower 的回复:
不知你的 非AlarmCatagoryNode类 需不需要显示那些RadioButton,如果不需要,可以再添加一个绑定,只有AlarmCatagoryNode类才显示,之后在你现有的Converter里面加入条件判断,只有AlarmCatagoryNode类才“真正转换”,不是的话,随便返回一个IsChecked的有效值就行了(反正不影响界面效果)。
不需要的。 在哪里添加什么Binding?能说的详细一点吗?
回复 点赞
Bonjour-你好 2014年02月10日
忘了,应该可以直接Binding它自己本身,这样你在Converter里面就可以判断这个Node类是否是AlarmCatagoryNode类。
回复 点赞
Bonjour-你好 2014年02月10日
不知你的 非AlarmCatagoryNode类 需不需要显示那些RadioButton,如果不需要,可以再添加一个绑定,只有AlarmCatagoryNode类才显示,之后在你现有的Converter里面加入条件判断,只有AlarmCatagoryNode类才“真正转换”,不是的话,随便返回一个IsChecked的有效值就行了(反正不影响界面效果)。
回复 点赞
发动态
发帖子
WPF/Silverlight
创建于2007-09-28

8162

社区成员

1.1w+

社区内容

WPF/Silverlight相关讨论
社区公告
暂无公告