Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf MVVM IValueConverter Convert方法在需要浮点时获取空字符串参数_Wpf_Binding_Mvvm_Ivalueconverter - Fatal编程技术网

Wpf MVVM IValueConverter Convert方法在需要浮点时获取空字符串参数

Wpf MVVM IValueConverter Convert方法在需要浮点时获取空字符串参数,wpf,binding,mvvm,ivalueconverter,Wpf,Binding,Mvvm,Ivalueconverter,这可能会有点长,但现在开始。我已经使用MVVM模式创建了一个小的、向导式的示例应用程序,基本上是我真实应用程序中代码的简化版本。在这个应用程序中,主窗口在视图模型列表中移动,每个视图模型显示其关联视图。我有两个基本相同的视图模型类,它们显示相同的视图 视图上有一个组合框,其中填充了一个浮点数组。SelectedItem绑定到视图模型上的浮点属性。我已经为组合框创建了一个模板,将每个项目显示为一个文本块,文本接受浮点值并通过一个值转换器 问题是,当我在视图模型之间来回切换时,只要切换到的每个视图模

这可能会有点长,但现在开始。我已经使用MVVM模式创建了一个小的、向导式的示例应用程序,基本上是我真实应用程序中代码的简化版本。在这个应用程序中,主窗口在视图模型列表中移动,每个视图模型显示其关联视图。我有两个基本相同的视图模型类,它们显示相同的视图

视图上有一个组合框,其中填充了一个浮点数组。SelectedItem绑定到视图模型上的浮点属性。我已经为组合框创建了一个模板,将每个项目显示为一个文本块,文本接受浮点值并通过一个值转换器

问题是,当我在视图模型之间来回切换时,只要切换到的每个视图模型都属于同一类,所有视图模型都可以正常工作。只要我将当前页面更改为不同视图模型的实例,就会使用长度为零的字符串“value”参数调用值转换器的Convert。直到那时,正如我所预料的,Convert只被一个float调用

我的问题:为什么只有在切换视图模型类的情况下才使用空字符串调用转换器

我正在附加主窗口XAML和视图模型,以及为每个页面显示的视图/视图模型。您会注意到,主窗口视图模型有一个列表,其中包含2个PageViewModel实例和2个OtherViewModel实例。我可以在前2个精细值之间来回切换,并且值转换器只能使用浮点值调用。切换到第一个OtherViewModel实例后,转换器将获得一个额外调用,该调用的值为空字符串

代码片段:

主窗口

<Grid.Resources>
    <DataTemplate DataType="{x:Type local:PageViewModel}">
        <local:PageView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:OtherViewModel}">
        <local:PageView />
    </DataTemplate>
</Grid.Resources>

<!-- Page -->
<ContentControl Margin="5,5,5,35"
                Height="100"
                IsTabStop="False"
                Content="{Binding CurrentPage}" />

<!-- Commands -->
<Button Margin="5,115,0,0" 
        Width="75"
        Content="&lt; Back"
        VerticalAlignment="Top"
        HorizontalAlignment="Left"
        Command="{Binding BackCommand}" />

<Button Margin="85,115,0,0"
        Width="75"
        Content="Next &gt;"
        VerticalAlignment="Top"
        HorizontalAlignment="Left"
        Command="{Binding NextCommand}" />
注意:我可以删除Convert方法中的异常,并且一切都正常。但是,我想知道为什么会发生这种情况。为什么转换器得到的是一个空字符串而不是预期的浮点值,并且只有在切换视图模型时才得到

如有任何见解,将不胜感激。先谢谢你。。。 乔

试试看

public BaseViewModel
{
   public virtual float Depth{get;set;}
   ...
}
然后

那么您只需要一个数据模板

<Grid.Resources>
    <DataTemplate DataType="{x:Type local:BaseViewModel}">
        <local:PageView />
    </DataTemplate>
</Grid.Resources>
我猜传递给转换器的奇怪值是由于数据模板被切换

未测试

尝试

public BaseViewModel
{
   public virtual float Depth{get;set;}
   ...
}
然后

那么您只需要一个数据模板

<Grid.Resources>
    <DataTemplate DataType="{x:Type local:BaseViewModel}">
        <local:PageView />
    </DataTemplate>
</Grid.Resources>
我猜传递给转换器的奇怪值是由于数据模板被切换


未测试

我对枚举而不是浮点也有同样的问题

关闭视图时,组合框选择将清空。您可以通过处理SelectionChanged事件并检查SelectionChangedEventArgs RemovedItems集合来检查这一点。 这以字符串结尾。Empty被传递到ValueConverter

在我的例子中,我修改了ValueConverter.Convert以允许string.Empty作为有效值,并返回string.Empty。 这是我使用的代码:

// When view is unloaded, ComboBox Selection is emptied and Convert is passed string.Empty 
// Hence we need to handle this conversion
if (value is string && string.IsNullOrEmpty((string)value))
{
    return string.Empty;
}

我对枚举而不是浮点也有同样的问题

关闭视图时,组合框选择将清空。您可以通过处理SelectionChanged事件并检查SelectionChangedEventArgs RemovedItems集合来检查这一点。 这以字符串结尾。Empty被传递到ValueConverter

在我的例子中,我修改了ValueConverter.Convert以允许string.Empty作为有效值,并返回string.Empty。 这是我使用的代码:

// When view is unloaded, ComboBox Selection is emptied and Convert is passed string.Empty 
// Hence we need to handle this conversion
if (value is string && string.IsNullOrEmpty((string)value))
{
    return string.Empty;
}

您是否尝试将DataTemplate上的DataType设置为float?Silvermind,我刚刚尝试将DataType={x:Type sys:Single}添加到PageView上的DataTemplate行,但仍然遇到相同的问题。我仍然收到一个以空字符串作为值的转换器调用。您是否尝试将DataTemplate上的DataType设置为float?Silvermind,我刚刚尝试将DataType={x:Type sys:Single}添加到PageView上的DataTemplate行,但我仍然遇到同样的问题。我仍然收到一个以空字符串作为值的转换器调用。Phil,我尝试了这个,它似乎有效。我甚至不必更改视图模型,只需更改DataTemplate,问题就消失了。也就是说,在DataTemplate必须不同的情况下,这仍然是一个问题。在这个示例应用程序中,我在两个视图模型之间重复使用了视图。但是,在我更复杂的应用程序中,这不是一个选项。因此,仍然不确定是否有完整的解决方案。我会尝试更多的搜索…菲尔,我尝试过这个,它似乎奏效了。我甚至不必更改视图模型,只需更改DataTemplate,问题就消失了。也就是说,在DataTemplate必须不同的情况下,这仍然是一个问题。在这个示例应用程序中,我在两个视图模型之间重复使用了视图。但是,在我更复杂的应用程序中,这不是一个选项。因此,仍然不确定是否有完整的解决方案。将尝试更多搜索。。。
<Grid.Resources>
    <DataTemplate DataType="{x:Type local:BaseViewModel}">
        <local:PageView />
    </DataTemplate>
</Grid.Resources>
// When view is unloaded, ComboBox Selection is emptied and Convert is passed string.Empty 
// Hence we need to handle this conversion
if (value is string && string.IsNullOrEmpty((string)value))
{
    return string.Empty;
}