59

に基づくカスタムコントロールから、次のようにTextBox、という名前のプロパティを作成しましたItems

public class NewTextBox : TextBox
{
    public ItemCollection Items { get; set; }
}

XAMLでカスタムコントロールを使用すると、「DependencyObjectのDependencyPropertyにのみ'Binding'を設定できる」という例外が発生するため、プロパティをバインドできません。

この例外を解決するにはどうすればよいですか?

4

7 に答える 7

30

この例外を解決するには、プロパティを変更し、XAMLで「リンク」としてItems機能するを追加する必要があります。DependencyPropertyクラスは次のようになります。

public class AutocompleteTextBox : TextBox
{
    public ItemCollection Items
    {
        get {
            return (ItemCollection)GetValue(ItemsProperty); }
        set {
            SetValue(ItemsProperty, value); }
    }

    public static readonly DependencyProperty ItemsProperty =
        DependencyProperty.Register(
            "Items",
            typeof(ItemCollection),
            typeof(AutocompleteTextBox),
            new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged));

    private static void OnItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // AutocompleteTextBox source = d as AutocompleteTextBox;
        // Do something...
    }
于 2012-07-11T15:12:34.710 に答える
27

もう 1 つの注意点があります。 の最初の引数の文字列がDependencyProperty.Register()、関連するプロパティの名前と一致していることを確認してください。

public static readonly DependencyProperty ItemsProperty =
    DependencyProperty.Register(
        "TheItems", // This is wrong
        typeof(ItemCollection),
        typeof(AutocompleteTextBox),
        new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged));

文字列を変更せずにプロパティの名前を変更したときに、この問題に遭遇しました。

于 2014-09-12T10:27:42.477 に答える
11

私が気づいたことの1つは、どこにも言及されているかどうかわかりませんが、DependencyPropertyの名前はプロパティ名と一致する必要があるということです

プロパティ名がItemsの場合、DependencyPropertyは ItemsPropertyである必要があります

私の場合、それらを一致させるとすぐにエラーは消えました

于 2020-01-03T19:57:30.000 に答える
1

(ランタイム+デザインタイム)メッセージがありました:

型 'System.Windows.Markup.XamlParseException' の未処理の例外が PresentationFramework.dll で発生しました

追加情報: タイプ 'Trigger' の 'Property' プロパティに 'Binding' を設定することはできません。「Binding」は、DependencyObject の DependencyProperty でのみ設定できます。

VMプロパティでトリガーを定義するのに十分なほど賢かった..

// incorrect.. cannot have Trigger for VM property
<Trigger Property="{Binding IsExpanded}" Value="True">
  <Setter Property="Visibility" Value="Visible"/>
</Trigger>

もちろん、これはデータトリガーでなければなりません(プロパティの代わりにバインディングを使用します)

<DataTrigger Binding="{Binding IsExpanded}" Value="True">
  <Setter Property="Visibility" Value="Visible"/>
</DataTrigger>

トリガーは通常、コントロール (Button、TextBox、FrameworkElement など) プロパティ用です。

于 2017-11-28T09:10:48.430 に答える