多插入 - 指定的铸件无效



下面的代码绑定列宽度: Samp1.ActualWidthSamp2.ActualWidth to StatName.Width。请参阅:将datagrid列宽度绑定到另一个datagrid的两个colums

但是,设计师报告了错误Specified cast is not valid.,但是尽管存在错误,但代码仍然按预期进行编译和执行。

即使它按预期运行,"错误"仍然会使我烦恼。

问题:是什么引起错误:Specified cast is not valid.?什么是什么?我该如何修复?如果修复不直接,我至少可以隐藏或忽略错误?

注意:问题WPF多点线与设计器异常相似。但是,该代码导致运行时异常,而我的代码会导致构建错误并运行正常(没有任何例外)。

xaml:

<Page.Resources>
    <local:WidthConverter x:Key="WidthConverter" />
</Page.Resources>
<!--- ... -->
<DataGrid IsReadOnly="True" HeadersVisibility="Column">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="Samp1" Binding="{Binding a}" Header="S1"  />
        <DataGridTextColumn x:Name="Samp2" Binding="{Binding b}" Header="S2"  />
        <DataGridTextColumn x:Name="Total" Binding="{Binding c}" Header="Tot" />
    </DataGrid.Columns>
    <local:MyGenericRecord a="5000" b="2500" c="7500" />
    <local:MyGenericRecord a="1000" b="1500" c="2500" />
</DataGrid>
<DataGrid IsReadOnly="True" HeadersVisibility="Column">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="StatName"  Binding="{Binding a}" Header="Stat">
            <DataGridTextColumn.Width >
                <!-- ####################################### -->
                <!-- Begin error: Specified cast is invalid. -->
                <MultiBinding Converter="{StaticResource WidthConverter}">
                    <Binding Source="{x:Reference Samp1}" Path="ActualWidth" />
                    <Binding Source="{x:Reference Samp2}" Path="ActualWidth" />
                </MultiBinding>
                <!-- End error -->
                <!-- ###################################### -->
            </DataGridTextColumn.Width>
        </DataGridTextColumn>
        <DataGridTextColumn x:Name="StatValue" Binding="{Binding b}" Header="Val" Width="{Binding ElementName=Total, Path=ActualWidth}" />
    </DataGrid.Columns>
    <local:MyGenericRecord a="Min" b="2500" />
    <local:MyGenericRecord a="Max" b="7500" />
    <local:MyGenericRecord a="Average" b="5000" />
</DataGrid>

转换器:

public class WidthConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double totalWidth = 0;
        foreach (double Width in values)
            totalWidth += Width;
        DataGridLength outLen = new DataGridLength(totalWidth);
        return outLen;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return new object[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue};
    }
}
public class MyGenericRecord
{
    public string a { get; set; }
    public string b { get; set; }
    public string c { get; set; }
}

在任何转换器中,您应该始终期望值(或值)可以是DependencyProperty.UnsetValue。当由于任何原因无法获得实际值时,WPF使用此值。当无法解析绑定时,通常会发生这种情况(例如,您绑定到不存在的属性)。WPF设计师不会编译整个代码,因此可能会出现不良,尤其是对绑定。请注意,null无法使用UnsetValue,因为null可以是有效的值。因此,请期待UnsetValue,如果可能的话,请尝试在这种情况下做一些有意义的事情。例如:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    double totalWidth = 0;
    foreach (double Width in values.OfType<double>())
        totalWidth += Width;
    DataGridLength outLen = new DataGridLength(totalWidth);
    return outLen;
}

这将忽略所有不是双倍的值(包括UnsetValue)。

相关内容

  • 没有找到相关文章

最新更新