문제
풍부한 TreeView(노드 이름 바꾸기, 하위 노드 추가 등을 위한 상황에 맞는 메뉴가 있는 것)에 대한 UserControl을 만들고 있습니다.나는 이 컨트롤을 사용하여 내가 만들 계층적 데이터 구조를 관리하거나 탐색할 수 있기를 원합니다.현재 다음 인터페이스를 구현하는 모든 데이터 구조에 대해 작업하고 있습니다(인터페이스는 실제로 구현될 필요는 없지만 이러한 멤버만 있으면 됩니다).
interface ITreeItem
{
string Header { get; set; }
IEnumerable Children { get; }
}
그런 다음 UserControl에서 템플릿을 사용하여 다음과 같이 트리를 데이터 구조에 바인딩합니다.
<TextBlock x:Name="HeaderTextBlock" Text="{Binding Path=Header}" />
제가 하고 싶은 일은 RichTreeView에서 이러한 각 멤버의 이름을 정의하여 다음과 같이 다양한 데이터 구조에 적응할 수 있도록 하는 것입니다.
class MyItem
{
string Name { get; set; }
ObservableCollection<MyItem> Items;
}
<uc:RichTreeView ItemSource={Binding Source={StaticResource MyItemsProvider}}
HeaderProperty="Name" ChildrenProperty="Items" />
UserControl 내부의 바인딩 경로를 해당 UserControl의 공용 속성으로 노출할 수 있는 방법이 있습니까?이 문제를 해결하는 다른 방법이 있습니까?
해결책
아마도 이것이 도움이 될 수 있습니다:
헤더 종속성 속성에 HeaderProperty 속성을 설정할 때 새 바인딩을 만듭니다.
헤더 속성은 일반적인 일상적인 종속성 속성입니다.
public string Header
{
get { return (string)GetValue(HeaderProperty); }
set { SetValue(HeaderProperty, value); }
}
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(string), typeof(ownerclass));
HeaderProperty의 속성은 다음과 같이 작동합니다.
public static readonly DependencyProperty HeaderPropertyProperty =
DependencyProperty.Register("HeaderProperty", typeof(string), typeof(ownerclass), new PropertyMetadata(OnHeaderPropertyChanged));
public string HeaderProperty
{
get { return (string)GetValue(HeaderPropertyProperty); }
set { SetValue(HeaderPropertyProperty, value); }
}
public static void OnHeaderPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (args.NewValue != null)
{
ownerclass c = (ownerclass) obj;
Binding b = new Binding();
b.Path = new PropertyPath(args.NewValue.ToString());
c.SetBinding(ownerclass.HeaderProperty, b);
}
}
HeaderProperty는 HeaderProperty가 변경되자마자 호출되는 메서드가 포함된 일반적인 일상적인 종속성 속성입니다.따라서 변경되면 HeaderProperty에 설정한 경로에 바인딩될 헤더에 바인딩이 생성됩니다.:)
제휴하지 않습니다 StackOverflow