0

2 つの主要な状態を持つことができるコントロールを設計しています。状態は、依存プロパティを介して設定されます。XAML 経由でプロパティを設定したいと思います。ここで説明されているように、XAML 経由で設定されている場合、セッターは setValue コードのみを実行することを知っています: WPF: XAML プロパティ宣言がセッター経由で設定されていませんか?

そこで、DependencyPropertyChangedEvent イベントを設定しようとしましたが、コードを実行すると次のエラーが発生します。

XamlParseException Occurred
'The invocation of the constructor on type 'RouteOneClient.VehicleInfoControl'
that matches the specified binding constraints threw an exception.' Line number 
'134' and line position '34'.

それを調べると、イベントでコントロールの新しいインスタンスを作成できないことがわかります。C# ロジックは次のようになります。

    public enum VehicleType
    {
        Sale = 1,
        Trade = 2,
    }

    public static readonly DependencyProperty VehicleTypeProperty =  DependencyProperty.Register(
        "VehicleTYPE", 
        typeof(VehicleType), 
        typeof(VehicleInfoControl), 
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnVehTypeChanged)));  // optionally metadata for defaults etc.

    public VehicleInfoControl()
    {
        InitializeComponent();
    }

    public VehicleType VehicleTYPE
    {
        get { return (VehicleType)GetValue(VehicleTypeProperty); }
        set
        {
            SetValue(VehicleTypeProperty, value);
        }          
    }

    private static void OnVehTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        VehicleInfoControl instance = d as VehicleInfoControl;

        if (instance.VehicleTYPE == VehicleType.Sale)
        {
            instance.TitleLabel.Content = "Sale Vehicle";
            instance.IntendedUse.Visibility = System.Windows.Visibility.Visible;
            instance.VehicleNewUsed.Visibility = System.Windows.Visibility.Visible;
            instance.VehicleVin.Visibility = System.Windows.Visibility.Visible;
            instance.VehicleInceptionMiles.Visibility = System.Windows.Visibility.Visible;
            instance.IntendedUseLabel.Visibility = System.Windows.Visibility.Visible;
            instance.VehicleNewUsedLabel.Visibility = System.Windows.Visibility.Visible;
            instance.VehicleVinLabel.Visibility = System.Windows.Visibility.Visible;
            instance.VehicleInceptionMilesLabel.Visibility = System.Windows.Visibility.Visible;
        }
        else
        {
            instance.TitleLabel.Content = "Trade Vehicle";
            instance.IntendedUse.Visibility = System.Windows.Visibility.Hidden;
            instance.VehicleNewUsed.Visibility = System.Windows.Visibility.Hidden;
            instance.VehicleVin.Visibility = System.Windows.Visibility.Hidden;
            instance.VehicleInceptionMiles.Visibility = System.Windows.Visibility.Hidden;
            instance.IntendedUseLabel.Visibility = System.Windows.Visibility.Hidden;
            instance.VehicleNewUsedLabel.Visibility = System.Windows.Visibility.Hidden;
            instance.VehicleVinLabel.Visibility = System.Windows.Visibility.Hidden;
            instance.VehicleInceptionMilesLabel.Visibility = System.Windows.Visibility.Hidden;
        }
    }

そしてXAML:

<Expander Header="Vehicle Information" Width="Auto" Height="Auto" Grid.Row="2">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width=".3*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <custom:VehicleInfoControl x:Name="SaleVeh" Width="Auto" Height="Auto" Grid.Column="0" VehicleTYPE="Sale"/>
        <custom:VehicleInfoControl x:Name="TradeVeh" Width="Auto" Height="Auto" Grid.Column="2" VehicleTYPE="Trade"/>

    </Grid>
</Expander>

上記のエラーは、行を指しています。

フォームを正しくフォローしているように感じますが、実行されていません。何か案は?

4

2 に答える 2

3

依存関係プロパティの型は列挙型で、これはValueTypenullですが、プロパティ メタデータで既定のプロパティ値として指定します。nullは ValueType の有効な値ではないため、これは機能しません。

于 2012-05-25T13:16:22.847 に答える
2

依存関係プロパティを登録するときに、「null」を「FrameworkPropertyMetadata」コンストラクターに渡します。

渡す最初のパラメーターは、Dependency プロパティの既定値になります。あなたの場合、ENUM型の依存関係プロパティのデフォルト値としてNullを渡していますが、これは許可されていません。

有効なデフォルト値を渡すと、問題が解決する場合があります..

このようなことができるかもしれません

new FrameworkPropertyMetadata(VehicleType.Sale,  FrameworkPropertyMetadataOptions.AffectsRender,  new PropertyChangedCallback(OnVehTypeChanged)));
于 2012-05-25T13:18:30.180 に答える