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

ここSOでこれを何度も書きました。この状況の最も簡単な方法は、ビューにバインドするためにビューモデルに文字列プロパティを設定することです。次に、IDataErrorInfo でこのプロパティが int であることを検証するだけです。これが成功した場合、保存コマンドが呼び出される前に文字列を単純に int に変換できます。

ビューモデルに int プロパティがある限り、入力が int に変換できないときに常に BindingException を受け取ることができます。

ps: これを確実にする 1 つの方法は、数値テキスト ボックスを使用するか、数値のみが許可されている場合にマスクされた動作を使用することです。

于 2012-05-31T06:50:29.360 に答える