1

我在网格内使用用户控件。此用户控件包含一个文本框,该文本框绑定了视图模型提供的对象的属性。我的问题是属性可以是字符串或整数。

我将依赖属性设置为字符串,因此它可以正常显示,但是如果用户在 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>

后面的用户控制代码

public partial class UserControlTextBox : UserControl
{
    public static DependencyProperty LabelTextProperty = DependencyProperty.Register("LabelText", typeof(String), typeof(UserControl));
    public static DependencyProperty TextBoxTextProperty = DependencyProperty.Register("TextBoxText", typeof(String), typeof(UserControl));


    public String LabelText
    {
        get { return (String)GetValue(LabelTextProperty); }
        set { SetValue(LabelTextProperty, value); }
    }

    public String TextBoxText
    {
        get { return (String)GetValue(TextBoxTextProperty); }
        set { SetValue(TextBoxTextProperty, value); }
    }

    public UserControlTextBox()
    {
        InitializeComponent();
        GridLayout.DataContext = this;
    }
    }

在主网格中调用用户控件的示例

<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。

有什么方法可以使依赖属性通用或基于传递给用户控件的参数。或者有什么方法可以在用户点击保存按钮之前进行验证?

谢谢

4

2 回答 2

1

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

于 2012-05-30T07:35:45.827 回答
0

我在这里写了很多时间。这种情况下最简单的方法是在您的视图模型中有一个字符串属性以绑定到您的视图。那么你只需要在你的 IDataErrorInfo 中验证这个属性是一个 int。如果成功,您可以在调用 save 命令之前将您的字符串转换为 int。

只要您的视图模型中有一个 int 属性,您就可以一直收到 BindingException 输入不可转换为 int。

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

于 2012-05-31T06:50:29.360 回答