programing

'Binding'은 종속성 개체의 종속성 속성에만 설정할 수 있습니다.

skycolor 2023. 4. 27. 22:05
반응형

'Binding'은 종속성 개체의 종속성 속성에만 설정할 수 있습니다.

다음을 기반으로 하는 사용자 정의 컨트롤TextBox다음 이름의 속성을 만들었습니다.Items다음과 같은 방식으로:

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

XAML에서 사용자 지정 컨트롤을 사용할 때 "Binding'은 Dependency Object의 Dependency Property에만 설정할 수 있습니다." 예외가 발생하기 때문에 속성을 바인딩할 수 없습니다.

이 예외를 해결하려면 어떻게 해야 합니까?

참고로 객체 간에 복사하여 붙여넣고 두 번째를 변경하는 것을 잊어버린 경우 이러한 바인딩 오류가 발생한다는 점도 유의할 필요가 있습니다.typeof(Object)진술.

저는 모든 것이 정의되고 정확한 것처럼 보였기 때문에 왜 이런 오류가 발생했는지 알 수 없었습니다.단일 집합에서 목록으로 이동하기 위해 속성을 사용자 컨트롤로 이동했습니다.따라서:

public static readonly DependencyProperty FoldersProperty = DependencyProperty
    .Register("Folders", typeof(OutlookFolders), typeof(MainWindow),
    new FrameworkPropertyMetadata(new OutlookFolders()));

public OutlookFolders Folders
{
    get { return GetValue(FoldersProperty) as OutlookFolders; }
    set { SetValue(FoldersProperty, value); }
}

다음이 되어야 함:

public static readonly DependencyProperty FoldersProperty = DependencyProperty
    .Register("Folders", typeof(OutlookFolders), typeof(SavedFolderControl), 
    new FrameworkPropertyMetadata(new OutlookFolders()));

public OutlookFolders Folders
{
    get { return GetValue(FoldersProperty) as OutlookFolders; }
    set { SetValue(FoldersProperty, value); }
}

이 변경을 수행할 때까지 다음 오류가 계속 발생했습니다.A 'Binding' cannot be set on the property 'Folders' of type 'SavedFolderControl'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

이 예외를 해결하려면 속성을 변경해야 합니다.Items그리고 a를 추가DependencyPropertyXAML에서 "링크"로 작동합니다. 클래스는 다음과 같습니다.

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...
    }

여기 또 다른 gotcha가 있습니다: 첫 번째 인수의 문자열을 확인합니다.DependencyProperty.Register()관련 속성의 이름과 일치합니다.

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

문자열을 변경하지 않고 속성 이름을 변경할 때 이 문제가 발생했습니다.

제가 알아차린 한 가지, 그리고 어디에도 언급되지 않은 것은 종속성 속성의 이름이 속성 이름과 일치해야 한다는 것입니다.

속성 이름이 Items이면 DependencyPropertyItemsProperty여야 합니다.

저의 경우, 그것들을 맞추자 마자 오류가 사라졌습니다.

이 문제의 또 다른 잠재적 원인은 메타데이터의 기본값에 잘못된 유형을 제공한 경우입니다.
예를 들어:

new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)

대신 다음과 같이 쓰면 이 오류가 발생합니다.

new PropertyMetadata(false, OnItemsPropertyChanged)

코드 원본에서 복사하여 붙여넣는 경우에도 이 문제가 발생할 수 있습니다.

(실행 시간 + 설계 시간) 메시지가 표시되었습니다.

'시스템' 유형의 처리되지 않은 예외입니다.창문들.PresentationFramework.dll에서 Markup.XamlParseException'이(가) 발생했습니다.

추가 정보:'트리거' 유형의 '속성' 속성에는 '바인딩'을 설정할 수 없습니다.'Binding'은 종속성 개체의 종속성 속성에만 설정할 수 있습니다.

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>

트리거는 일반적으로 Controls(버튼, TextBox, FrameworkElement 등) 속성에 사용됩니다.

저는 제가 잘못해서 이 문제를 겪었습니다.나는 썼습니다.

<Button.Visibility>
   <MultiBinding Converter="{StaticResource mvbConverter}">
     <Binding Path="{Binding isActive}" />
     <Binding Path="{Binding isCashTransaction}" />
   </MultiBinding>
</Button.Visibility>

대신에 내가 썼어야 했을 때.

<Button.Visibility>
   <MultiBinding Converter="{StaticResource mvbConverter}">
     <Binding Path="isActive" />
     <Binding Path="isCashTransaction" />
   </MultiBinding>
</Button.Visibility>

언급URL : https://stackoverflow.com/questions/11435781/a-binding-can-only-be-set-on-a-dependencyproperty-of-a-dependencyobject

반응형