2

以下に添付した記事「Dependency Properties in WPF」のコードを実行しようとしています。

SetValue(MyDependencyProperty, value);ただし、アプリは例外を除いてオンラインで中断します。

System.Windows.Markup.XamlParseException   
"'' is not a valid value for property 'MyProperty'."

内部例外:

{"'指定されたバインディング制約に一致するタイプ '_3DP_CallBack_DefaultValue.MainWindow' でのコンストラクターの呼び出しにより、例外がスローされました。' 行番号 '3' および行位置 '9'."}

ここに画像の説明を入力

このアプリを実行するには何を変更すればよいですか?

WPF アプリのコード:

namespace _3DP_CallBack_DefaultValue
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
      DependencyPropertySample dpSample = new DependencyPropertySample();
      dpSample.MyProperty = "Dependency Property Test";//???

      Binding mybinding = new Binding("MyProperty");
      mybinding.Mode = BindingMode.OneWay;
      mybinding.Source = dpSample;
      BindingOperations.SetBinding(MyTextblock, TextBox.TextProperty, mybinding);
    }
  }
  public class DependencyPropertySample : DependencyObject
  {
    //Register Dependency Property
    public static readonly DependencyProperty MyDependencyProperty 
      = DependencyProperty.Register
           (
               "MyProperty", typeof(string), typeof(DependencyPropertySample), 
               new PropertyMetadata
                 (
                    "Test", 
                    new PropertyChangedCallback(OnMyPropertyChanged), 
                    new CoerceValueCallback(OnCoerceValue)
                 ), 
                 new ValidateValueCallback(OnValidateMyProperty) 
           );

    public string MyProperty
    {
      get
      {
        return (string)GetValue(MyDependencyProperty);
      }
      set
      {
//***************************
//breaking on the following line trying to set any string value   
// in this case "Dependency Property Test"
        SetValue(MyDependencyProperty, value);
      }
    }

    public static void OnMyPropertyChanged(DependencyObject dObject,
          DependencyPropertyChangedEventArgs e)
    {
      MessageBox.Show(e.NewValue.ToString());
    }
    public static string OnCoerceValue(DependencyObject dObject, object val)
    {
      if (val.ToString().CompareTo("Test") == 1)
      {
        return val.ToString();
      }
      return string.Empty;
    }
    public static bool OnValidateMyProperty(object myObj)
    {
      if (myObj.ToString() == string.Empty)
        return false;
      return true;
    }
  }
}

XAML:

<Window x:Class="_3DP_CallBack_DefaultValue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Label Content="Enter String:" Grid.Row="0"
            VerticalAlignment="Center" />
        <TextBox Text="" Name="MyTextblock" Height="25"
             Width="150" HorizontalAlignment="Right" />
    </Grid>
</Window>

アップデート:

上記は、以前の 2 つの WPF アプリを含む WPF アプリの 3d (インクリメンタル) バージョンで、エラーなしで実行しました

2番目のバージョンには次のものがありました:

  • まったく同じ XAML コード
  • まったく同じ C#MainWindow()のコンストラクター/メソッドの本体。
  • に存在しないメソッドclass DependencyPropertySample : DependencyObject{}
    • OnMyPropertyChanged( DependencyObject dObject, DependencyPropertyChangedEventArgs e)
    • OnValidateMyProperty(object myObj)
    • OnCoerceValue(DependencyObject dObject, object val)

public static readonly DependencyProperty MyDependencyProperty = DependencyProperty.Register()は異なっていました:

2番目のバージョンの作業からDependencyPropertySampleのクラスのコードは次のとおりです。

public class DependencyPropertySample : DependencyObject
{
  //Register Dependency Property
  public static readonly DependencyProperty MyDependencyProperty = 
           DependencyProperty.Register
              ("MyProperty", typeof(string), typeof(DependencyPropertySample));
public string MyProperty
{
  get
  {
    return (string)GetValue(MyDependencyProperty);
  }
  set
  {
    SetValue(MyDependencyProperty, value);
  }
}

app の失敗した 3D バージョンからDependencyPropertySampleのクラスのコードは次のとおり です。

  public class DependencyPropertySample : DependencyObject
  {
    //Register Dependency Property
    public static readonly DependencyProperty MyDependencyProperty 
      = DependencyProperty.Register
           (
               "MyProperty", typeof(string), typeof(DependencyPropertySample), 
               new PropertyMetadata
                 (
                    "Test", 
                    new PropertyChangedCallback(OnMyPropertyChanged), 
                    new CoerceValueCallback(OnCoerceValue)
                 ), 
                 new ValidateValueCallback(OnValidateMyProperty) 
           );

    public string MyProperty
    {
      get
      {
        return (string)GetValue(MyDependencyProperty);
      }
      set
      {
        SetValue(MyDependencyProperty, value);
      }
    }
    public static void OnMyPropertyChanged(DependencyObject dObject,
          DependencyPropertyChangedEventArgs e)
    {
      MessageBox.Show(e.NewValue.ToString());
    }
    public static string OnCoerceValue(DependencyObject dObject, object val)
    {
      if (val.ToString().CompareTo("Test") == 1)
      {
        return val.ToString();
      }
      return string.Empty;
    }
    public static bool OnValidateMyProperty(object myObj)
    {
      if (myObj.ToString() == string.Empty)
        return false;
      return true;
    }
  }
4

1 に答える 1