【问题标题】:Converter doesn't get called转换器没有被调用
【发布时间】:2019-04-11 12:22:21
【问题描述】:

我在 xaml 中声明了转换器:

<local:StringToWidthConverter x:Key="Converter" />

<GridViewColumn Header="Monitor 4"
                Width="{Binding Monitor4, Converter={StaticResource Converter}, ConverterParameter=Auto}">

转换器类定义为:

public class StringToWidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (string)value == null ? 0.0 : parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

Monitor4 定义为:

public string Monitor4
{
    get { return monitor4; }
    set
    {
        monitor4 = value;
        OnPropertyChanged("Monitor4");
    }
}

但是转换器永远不会被调用?任何建议都会很棒。提前谢谢你。

【问题讨论】:

  • 转换器是否在 GridViewColumn 所在的 XAML 文件中声明?
  • @IvanVargas 我尝试在windows资源和listview资源中声明,没用。

标签: c# wpf mvvm converters


【解决方案1】:

我能想到的唯一原因是您忘记设置DataContext,因此根本没有要绑定的源。

this.DataContext = The_View_Model; 

如果DataContext设置正确,怎么知道转换器没有执行?在Convert方法中设置断点,是否命中断点?

如果您已正确设置 DataContext 并且某些绑定不起作用,请查看输出窗口,应该有一些绑定错误 - 与未处理的异常不同,VS 只是静默记录绑定错误而不会终止应用程序。

例如,如果你绑定到一个属性Monitor4,结果却是不存在的:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“ConverterWindow”(名称=“”)上找不到“Monitor4”属性。绑定表达式:路径=监视器4; DataItem='ConverterWindow' (Name='');目标元素是'网格'(名称='');目标属性是“宽度”(类型“双”)

如果值转换器工作不正常

System.Windows.Data 错误:6:“DynamicValueConverter”转换器无法转换值“Auto”(类型“String”)

在您的情况下,您无法将字符串值 Auto 转换为 Double。你可以返回System.Double.NaN

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return (string)value == null ? 0.0 : System.Double.NaN; 
}

【讨论】:

  • 我只是试图重现该问题,但它不起作用的唯一原因是因为 DataContext
  • @bris 你找到原因了吗?
  • @phuzi 谢谢你的帮助。我发现了这个问题。我有一个名为“ProfileItem”的类,其中包括属性“Monitor4”。在ViewModel中,有一个list这个类是绑定到一个listview上的。类中的每个属性都绑定到列表视图中的列。在 GridViewColumn 级别上,它似乎只能绑定到 ViewModel 中的一个属性,我稍后在 ViewModel 类中将其定义为“columnwidth”。它与GridViewColumn成功绑定,转换器能够正常工作。我还是不明白为什么 GridViewColumn 不能与其他类的属性绑定
  • @briswill 区别在于单个对象(实现 INotifyPropertyChanged 的​​ ViewModel)与对象列表(ViewModel 中的列表是 ObsevableColllection)。在列表视图中,行数很多,但只有一个表头,所有行共享相同的表头列定义,这就是为什么表头列宽只能绑定到单个对象——ViewModel本身。
  • 如果 Monitor4 属性是在 ProfileItem 类中定义的,并且您绑定到 ObservableCollection 列表,那么 Monitor4 有不同的值,那么应该如何计算列宽?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2018-11-12
  • 2013-12-07
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多