- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个内联 MultiBinding
使用 this post作为引用。更具体地说,我正在使用 Christian Myksvoll 的答案来创建自定义绑定(bind)。我的类(class)看起来像这样:
public class MultiBinder : MultiBinding
{
public MultiBinder(BindingBase[] bindings, object converter)
{
foreach (BindingBase b in bindings)
{
Bindings.Add(b);
}
Converter = converter as IMultiValueConverter;
}
public MultiBinder(BindingBase b1, BindingBase b2, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Converter = converter as IMultiValueConverter;
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Converter = converter as IMultiValueConverter;
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, BindingBase b4, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Bindings.Add(b4);
Converter = converter as IMultiValueConverter;
}
}
我添加了第一个数组构造函数只是为了看看我是否可以让它处理未知数量的绑定(bind),但我无法调用它。所以,我删除了它,现在我正在尝试使用 3 值构造函数:
<MyControl IsEnabled="{util:MultiBinder
{Binding Path=IsRequestedPriceControlEnabled},
{Binding Path=IsIndicative},
{StaticResource MultiBoolConverter}
}" />
它给我这个错误:
Cannot set MultiBinding because MultiValueConverter must be specified.
我提供的转换器实现了 IMultiValueConverter
并且在其他地方的样式 block 中使用没有问题。由于需要大量的控件类型和可变条件,我不能为此在样式 block 中使用它。
类声明:public class MultiBoolToBoolConverter : IMultiValueConverter
资源:<util:MultiBoolToBoolConverter x:Key="MultiBoolConverter" />
我唯一能想到的是它无法识别第三个参数是转换器。我试过修补 IsEnabled
明确设置 Converter
的内容就像 Discord 的示例(同时将类缩减为只有一个带有 2 个参数的构造函数),但这也不起作用。这给出了这个错误:
Unknown property 'Converter' for type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' encountered while parsing a Markup Extension.
有没有人做过这样的内联多重绑定(bind)并且知道我做错了什么?
注意:我使用的是 .NET 4.6,因此如果需要我可以使用任何其他功能。
即使 Evk 默认为 null 并使用虚拟转换器,我仍然在设计器中收到上面的“无法设置 [...]”错误。但是,它确实运行。我正在用这个测试它:
CommandParameter="{util:MultiBinder {Binding Path=IsExpiriesComboBoxEnabled}, {Binding Path=IsIndicative}, {StaticResource MultiBoolConverter}}"
如果我在 MultiBinder 中放置断点,它会正确进入 3 参数重载 (b1,b2,converter),我可以看到 Converter
被设置为 MultiBoolConverter。所以,我不知道为什么它仍然给设计者错误。
这个问题是一个非常非常愚蠢的问题。在将解决方案从 VS2008 迁移到 VS2015 后的某个时候,XAML 设计器给了我一个错误或其他东西,并建议禁用代码执行,所以我做了。因此,使用内联 multibinder 使它感到困惑,因为没有传入转换器。我很难找到在哪里重新打开代码执行,但是一旦找到,它就起作用了。因此,内联多重绑定(bind)确实有效——如果它正在被执行。
如果您遇到同样的问题,这是我没有找到的按钮:
最佳答案
首先,您的 MultiBinder
确实 工作,正如您在问题中提供的一样,没有任何修改。它不会在运行时产生任何错误,并且会调用正确的构造函数。
问题出在 WPF 设计器上,众所周知,它存在很多问题,并且在许多情况下会产生虚假错误,例如本例。当然,您可以忽略在设计器中看到的“错误”,但这很烦人,而且如果您忽略它们,您可能会错过真正的错误。
相反,我们可以找到设计师到底做错了什么,并尝试修复它。错误消息提供了一个线索,即在设计模式下传递给构造函数的转换器为空。然后我们可以这样修复它:
public class MultiBinder : MultiBinding {
public MultiBinder(BindingBase b1, BindingBase b2, object converter = null) {
Bindings.Add(b1);
Bindings.Add(b2);
Converter = converter as IMultiValueConverter;
CheckConverter();
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, object converter) {
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Converter = converter as IMultiValueConverter;
CheckConverter();
}
public MultiBinder(BindingBase b1, BindingBase b2, BindingBase b3, BindingBase b4, object converter) {
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
Bindings.Add(b4);
Converter = converter as IMultiValueConverter;
CheckConverter();
}
private void CheckConverter() {
if (Converter == null && DesignerProperties.GetIsInDesignMode(new DependencyObject())) {
// if we are in design mode - feed dummy converter which cannot be called to wpf designer
Converter = new DummyConverter();
}
}
private class DummyConverter : IMultiValueConverter {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
}
}
此绑定(bind)器在设计器和运行时都不会产生错误。
关于c# - 内联 MultiBinding 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057720/
MultiBinding 到背景属性不起作用。转换后,背景只是变成系统的默认颜色,而不是我在 MultiValueConverter 中设置的颜色。其他一切都已正确设置。我的 MultiBinding
让我们考虑一种动物 Model如下: public class Animal { public string name { set; get; } public int age { s
下面的代码将列宽:Samp1.ActualWidth 和 Samp2.ActualWidth 绑定(bind)到 StatName.Width。请参阅:Bind DataGrid Column Wid
我在尝试将现有 XAML 转换为 MultiBinding 时遇到问题。 当前代码(需要替换)是 我现在拥有的:
我正在尝试转换一些单位。Convertback 函数应如何处理以下内容。获得以下 XAML。标签设置为我的 ViewModel 中的唯一对象。 这种风格...
我想做类似的事情 post但使用MultipleBindings。 所以是这样的:
以下代码用于绑定(bind) ListView,但对 ListView 的任何更改都不会返回到内存中的数据结构。当我有标准绑定(bind)时,它可以双向工作,但不能使用多重绑定(bind)。我需要使用
在 中设置样式(假设转换器返回红色)
关闭。这个问题需要debugging details .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Improve this question
我正在尝试使用标签控件在 XAML 中显示一个字符串。以下是我的 XAML 代码:
如何跳过更新MultiBinding的一些子绑定(bind)?我已经在代码隐藏中定义了一个 MultiBinding ,它需要两次读取-仅属性和一个普通属性生成单个值。在 ConvertBack 的情
我正在 wpf TreeView 上使用上下文菜单,并且我几乎可以满足我的需求。在解释问题之前,让我先解释一下上下文菜单的 XAML 定义的作用。 对于上下文菜单中的每个菜单项,我们都有一个命令,该命
使用 com.google.inject.multibindings.Multibinder 时,我对泛型有点困惑如下: interface MessageParser { fun accept(
我知道我可以使用特定注释进行 Guice 多重绑定(bind),如下所示 Multibinder.newSetBinder(binder(), Bound.class, Annotation.clas
基本上我需要知道的是如何发送 HierarchicalDataTemplate 的来源绑定(bind)到一个绑定(bind)中,这就是我所拥有的:
我创建了一个内联 MultiBinding使用 this post作为引用。更具体地说,我正在使用 Christian Myksvoll 的答案来创建自定义绑定(bind)。我的类(class)看起来
我有一个内置动态语言切换的应用程序。根据所选的文化,整个应用程序中的字符串都会发生变化。翻译后的字符串及其原始值来自资源文件。我使用绑定(bind)将资源值附加到按钮、标签等。大部分绑定(bind)发
我想做的很简单。我有一个窗口,我希望将标题绑定(bind)到两个不同的属性。每次属性之一更改时,标题都应更新。 我首先尝试的但没有成功 错
我创建了一个自定义的 MultiValue Converter 来在 MultiBinding 到 TextBox 时执行一些逻辑;但是我不想使用 convertBack,因为绑定(bind)值没有编
我这辈子都做不到。我需要从文本 block 中的一对时间跨度对象显示 hh:mm,但它无法正常工作。这是我目前所拥有的:
我是一名优秀的程序员,十分优秀!