سؤال

أنا خلق UserControl الغني TreeView (واحد يحتوي على قوائم السياق على تسمية العقد ، مضيفا الطفل العقد ، إلخ.).كنت تريد أن تكون قادرة على استخدام هذا التحكم لإدارة أو التنقل في أي الهرمية هياكل البيانات سوف تخلق.لدي حاليا يعمل على أي هيكل البيانات التي تطبق الواجهة التالية (واجهة تحتاج في الواقع لا يتم تنفيذها إلا بوجود هؤلاء الأعضاء مطلوب):

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 الملكية على رأس تبعية الملكية:

رأس الممتلكات الخاصة بك اليومية العادية DependencyProperty:

    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 الخاص بك اليومية العادية DependencyProperty مع طريقة الاحتجاج بمجرد HeaderProperty التغييرات.لذلك عندما يتغير , يخلق ملزمة على رأس الذي سيتم ربط المسار الذي يقع في HeaderProperty.:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top