'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를 추가DependencyProperty
XAML에서 "링크"로 작동합니다. 클래스는 다음과 같습니다.
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이면 DependencyProperty가 ItemsProperty여야 합니다.
저의 경우, 그것들을 맞추자 마자 오류가 사라졌습니다.
이 문제의 또 다른 잠재적 원인은 메타데이터의 기본값에 잘못된 유형을 제공한 경우입니다.
예를 들어:
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
'programing' 카테고리의 다른 글
UI 테이블 보기에서 누른 UI 버튼 감지 (0) | 2023.04.27 |
---|---|
Excel에서 NULL 셀 값을 출력합니다. (0) | 2023.04.27 |
Eclipse에서 디버깅하는 동안 변수가 표시되지 않음 (0) | 2023.04.27 |
Excel VBA를 사용하여 쉐어포인트 폴더의 내용 가져오기 (0) | 2023.04.27 |
YAML을 사용하여 파이프라인을 트리거하는 Azure 파이프라인 (0) | 2023.04.22 |