如何解决在WPF MVVM应用程序中,MultiBindingConvertor无法在网格上工作
| 我在WPF Telerik网格中有一列,我需要基于两点进行限制。 在viewmodel上的IsEditable属性和在网格上绑定到的List属性的IsManualChange属性... 我编写了一个MultiBoolConvertor来处理此问题,并在WPF中实现如下:<telerik:GridViewComboBoxColumn
Header=\"Selection\"
DataMemberBinding=\"{Binding HandHeldDifference.GRSSelection}\"
ItemsSource=\"{Binding Path=Selectionoptions}\">
<telerik:GridViewComboBoxColumn.IsReadOnly>
<MultiBinding Converter=\"{StaticResource MultiBoolConv}\"
ConverterParameter=\"True\">
<Binding
RelativeSource=\"{RelativeSource FindAncestor,AncestorType={x:Type StackPanel}}\"
Path=\"DataContext.IsEditable\" />
<Binding Path=\"IsManualChange\" />
</MultiBinding>
</telerik:GridViewComboBoxColumn.IsReadOnly>
</telerik:GridViewComboBoxColumn>
但是,进入Converter的值是bool(来自viewmodel)和IsManualChange的DependencyProperty.UnsetValue!
public object Convert(object[] values,Type targettype,object parameter,CultureInfo culture)
{
var defaultReturn = false;
if (parameter != null)
{
bool.TryParse(parameter.ToString(),out defaultReturn);
}
if (values == null) return defaultReturn;
if (values.Length < 2) return defaultReturn;
if (values[0] is bool && values[1] is bool)
{
return ((bool) values[0]) && ((bool) values[1]);
}
return defaultReturn;
}
第二个值显然无法通过“ values [1]是布尔值”比较
有一个线索可能是该转换器仅被调用一次,而不是我所期望的每行调用一次。
有谁知道我该如何工作呢?
解决方法
在传递DataContext之前,您将获得DependencyProperty.UnsetValue并需要处理这种情况。因此,您可以执行以下操作:
bool isManualChange= (value[1] is bool) ? (bool)value[1] : false; // or true depending on which should be the default
从上面的链接:
UnsetValue是一个前哨值,它是
用于WPF的方案
财产制度无法确定
请求的DependencyProperty值。
使用UnsetValue而不是null,
因为null可能是有效的属性
值,以及有效的(和
常用)DefaultValue。
因此,基本上,DataContext当前为null,因此它找不到名为IsManualChange
的属性,因此您获得UnsetValue。
设置上下文后,您的转换器应再次被调用。
, 事实证明,Telerik网格将IsReadOnly绑定到ViewModel,并且要绑定到ItemsSource中的项目时必须使用IsReadOnlyBinding!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。