gpt4 book ai didi

c# - WPF:ValueConverter (IValueConverter) 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:41 25 4
gpt4 key购买 nike

我有一个 Window 类,其中我有几个 TextBlock 元素,它们应该通过 的值接收 Background 颜色绑定(bind) 属性。第一个“Converter binding”工作正常并且可以完成预期的一切。今天我尝试用另一个用于它的 Converter 实现另一个“Converter binding”,但它不起作用:

(我省略了 ConvertBack 方法,因为它们在这里不是必需的):

namespace InsightTool.Gui.Helper {
[ValueConversion(typeof(double), typeof(Brush))]
public class AverageExecutionTimeToColorConverter : IValueConverter {
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
double val;
double.TryParse(value.ToString(), out val);

if (val >= 10000) {
return Brushes.Red;
} else if (val >= 5000) {
return Brushes.Orange;
} else {
return Brushes.Green;
}
}
}

[ValueConversion(typeof(int), typeof(Brush))]
public class ThreadsAvailableCountToColorConverter : IValueConverter {
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
int val;
int.TryParse(value.ToString(), out val);

if (val < 100) {
return Brushes.Red;
} else if (val < 200) {
return Brushes.Orange;
} else if (val < 500) {
return Brushes.Yellow;
} else {
return Brushes.Green;
}
}
}
}

Window 类中,我使用了如下两个转换:

<Window ...
x:Name="Main"
xmlns:Base="clr-namespace:InsightTool.Gui.Helper">
<Window.Resources>
<Base:ThreadsAvailableCountToColorConverter x:Key="ThreadsAvailableCntConverter"/>
<Base:AverageExecutionTimeToColorConverter x:Key="AvgExecutionTimeConverter"/>
</Window.Resources>

<!-- This one works fine-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ExecutionTimeAverage, Converter={StaticResource AvgExecutionTimeConverter}, ElementName=UCExecutionTimes}"/>

<!-- This one does not work-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, ElementName=Main}"/>
</Window>

DependencyProperties 声明:

public partial class UserControlExecutionTimes : UserControl {
public static readonly DependencyProperty ExecutionTimeAverageProperty =
DependencyProperty.Register("ExecutionTimeAverage", typeof(double), typeof(MainWindow), new FrameworkPropertyMetadata(double));

public double ExecutionTimeAverage {
get { return (double)GetValue(ExecutionTimeAverageProperty); }
set { SetValue(ExecutionTimeAverageProperty, value); }
}
}


public partial class MainWindow : Window {
public static readonly DependencyProperty ThreadsAvailableCountProperty = DependencyProperty.Register("ThreadsAvailableCount", typeof(int),
typeof(MainWindow), new FrameworkPropertyMetadata(int));

public int ThreadsAvailableCount {
get { return (int)GetValue(ThreadsAvailableCountProperty); }
set { SetValue(ThreadsAvailableCountProperty, value); }
}
}

两个 DependencyProperties 都已正确设置,并且它们的值显示在 GUI 中。我在这里想念什么?

编辑:

我还测试了以下内容:

<Window>
<!-- This one works fine-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource AvgExecutionTimeConverter}, ElementName=Main}"/>

<!-- This one does not work-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, ElementName=Main}"/>
</Window>

似乎 Binding 消耗"new"转换器的返回值有问题,但我不知道为什么。

EDIT2

我用 Snoop 检查绑定(bind),结果如下:

工作转换器绑定(bind)的 background 属性如下所示: working_background_binding

但是无效转换器绑定(bind)的 background 属性看起来是这样的: not_working_background_binding

ThreadsAvailableCount 设置正确的另一个证明(绑定(bind)到 Textblock): content_binding

显示ThreadsAvailableCountToColorConverter 的返回值越来越像是一个错误。这是因为在 Debug模式下,它会在 ThreadsAvailableCountToColorConverterConvert 方法中的断点处停止。它甚至成功地到达了Convert 方法中的return

最佳答案

啊!终于解决了这个问题。我有同样的问题。使用 TextBlock,使用 IValueConverter转换为 Brush

绑定(bind)有效,没有错误或输出。该值正在进入 IValueConverter 代码,我可以直接调试到 return 语句然后......什么都没有!

您所做的一切都是正确的,但是您自动导入了错误的Brushes。我一直使用 WPF 来做这件事。

替换using语句:

using System.Drawing

与:

using System.Windows.Media

WPF 使用 System.Windows.Media.Brushes,但是 非常 很容易导入几乎相同的 System.Drawing.Brushes 而不是注意。一切看起来都很好,直到 WPF 掌握它并且不能实际使用它。但它通过退回到默认颜色而“优雅地”失败。

关于c# - WPF:ValueConverter (IValueConverter) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39918156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com