usercontrol中的MVVM文本框绑定到不同类型

usercontrol中的MVVM文本框绑定到不同类型,mvvm,user-controls,Mvvm,User Controls,我正在网格中使用usercontrol。此usercontrol包含一个文本框,该文本框绑定了viewmodel提供的对象的属性。我的问题是属性可以是字符串或int 我将dependency属性设置为一个字符串,这样就可以很好地显示,但是如果用户在int字段中输入一个字符串,视图模型不会抛出任何验证错误,但是我当然不能保存到数据库中 用户控制XAML <UserControl x:Class="GenericFileTransferClient.Views.UserControlTextB

我正在网格中使用usercontrol。此usercontrol包含一个文本框,该文本框绑定了viewmodel提供的对象的属性。我的问题是属性可以是字符串或int

我将dependency属性设置为一个字符串,这样就可以很好地显示,但是如果用户在int字段中输入一个字符串,视图模型不会抛出任何验证错误,但是我当然不能保存到数据库中

用户控制XAML

<UserControl x:Class="GenericFileTransferClient.Views.UserControlTextBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Name="GridLayout">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition Width="7*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding Path=LabelText}" VerticalAlignment="Center" Style="{StaticResource ResourceKey=TextBlockWrapping}" />
        <DockPanel Grid.Column="1">
            <Border DockPanel.Dock="Right"
                                ToolTip="" Style="{StaticResource BorderReportDetail}">
                <TextBlock Text="?" Style="{StaticResource TextBoxReportDetail}"></TextBlock>
            </Border>
            <TextBox Text="{Binding Path=TextBoxText}"/>
        </DockPanel>
    </Grid>
</UserControl>
在主网格中调用usercontrol的示例

<views:UserControlTextBox LabelText="Report Name:" TextBoxText="{Binding Path=CurrentReport.ReportName}" Grid.Row="1" Grid.ColumnSpan="2"/>

            <TextBlock Text="Header:" Grid.Row="2"/>
            <CheckBox Grid.Column="1" Grid.Row="2" IsChecked="{Binding Path=CurrentReport.Header}" 
                      VerticalContentAlignment="Stretch" VerticalAlignment="Center" Name="HeaderCheckBox"/>

            <Grid Grid.Row="3" Grid.ColumnSpan="2" Visibility="{Binding IsChecked, ElementName=HeaderCheckBox, Converter={StaticResource BoolToVisConverter}}">

                <views:UserControlTextBox LabelText="# Row Header:" TextBoxText="{Binding Path=CurrentReport.HeaderRow}"/>
            </Grid>

如您所见,CurrentReport.ReportName是一个字符串,而CurrentReport.HeaderRow是一个int

是否有任何方法使依赖项属性成为通用属性或基于传递给usercontrol的参数。或者,在用户单击“保存”按钮之前,是否有任何方法可以进行验证


谢谢

我会写一个简单的
IntToStringConverter
,然后在你的
TextBoxText
绑定中使用它将字符串传递给你的用户控件。

我会写一个简单的
IntToStringConverter
然后在
TextBoxText
绑定中使用它将字符串传递给你的用户控件。

在这里写了很多时间,所以。对于这种情况,最简单的方法是在viewmodel中使用string属性绑定到视图。然后,您只需在IDataErrorInfo中验证该属性是否为int。如果成功,您可以在调用save命令之前将字符串转换为int

只要您的viewmodel中有int属性,您就可以在输入不可转换为int时始终接收BindingException


ps:确保这一点的一种方法是在只允许数字的情况下使用数字文本框或屏蔽行为。

我在这里写了很多时间。对于这种情况,最简单的方法是在viewmodel中使用string属性绑定到视图。然后,您只需在IDataErrorInfo中验证该属性是否为int。如果成功,您可以在调用save命令之前将字符串转换为int

只要您的viewmodel中有int属性,您就可以在输入不可转换为int时始终接收BindingException


ps:确保这一点的一种方法是在只允许数字的情况下使用数字文本框或屏蔽行为。

谢谢你的回复,这是我以前应该想到的一个简单想法。我刚刚实现了一个IntToStringConverter,但由于某些原因,我的convertback没有被解雇。我会调查原因并稍后编辑我的答案。谢谢你的回复,这是一个我以前应该想到的简单想法。我刚刚实现了一个IntToStringConverter,但由于某些原因,我的convertback没有被解雇。我将调查原因,稍后编辑我的答案。
<views:UserControlTextBox LabelText="Report Name:" TextBoxText="{Binding Path=CurrentReport.ReportName}" Grid.Row="1" Grid.ColumnSpan="2"/>

            <TextBlock Text="Header:" Grid.Row="2"/>
            <CheckBox Grid.Column="1" Grid.Row="2" IsChecked="{Binding Path=CurrentReport.Header}" 
                      VerticalContentAlignment="Stretch" VerticalAlignment="Center" Name="HeaderCheckBox"/>

            <Grid Grid.Row="3" Grid.ColumnSpan="2" Visibility="{Binding IsChecked, ElementName=HeaderCheckBox, Converter={StaticResource BoolToVisConverter}}">

                <views:UserControlTextBox LabelText="# Row Header:" TextBoxText="{Binding Path=CurrentReport.HeaderRow}"/>
            </Grid>