سؤال

وأنا محاولة لخلق AttachedProperty لDataGridColumn في سيلفرلايت 3.0 و أواجه بعض القضايا.

وهنا هو AttachedProperty:

public class DataGridColumnHelper
{
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.RegisterAttached("Header", typeof(string), typeof(DataGridColumnHelper),
                                            new PropertyMetadata(OnHeaderPropertyChanged));

    private static void OnHeaderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        string header = GetHeader(d);

        var dataGridColumn = d as DataGridColumn;

        if (dataGridColumn == null)
        {
            return;
        }

        dataGridColumn.Header = GetHeader(dataGridColumn);
    }

    public static string GetHeader(DependencyObject obj)
    {
        return (string)obj.GetValue(HeaderProperty);
    }

    public static void SetHeader(DependencyObject obj, string value)
    {
        obj.SetValue(HeaderProperty, value);
    }

}

وكما ترون انها حقا بسيطة، وأنا أحاول التغلب على القيود التي رأس الملكية في فئة DataGridColumn لا يمكن أن تكون ملزمة.

ويعمل هذا XAML كما هو متوقع ...

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
                         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"

                         Behaviors:DataGridColumnHelper.Header="User Name"/>

ولكن هذا XAML يلقي خطأ ... (على وجه التحديد: {System.Windows.Markup.XamlParseException: AG_E_PARSER_PROPERTY_NOT_FOUND [الخط: 224 الوظيفة: 112]    في System.Windows.Application.LoadComponent (المكون كائن، أوري resourceLocator)    ....})

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
                         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"

                         Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/>

ولمجرد التجريب ويعلق هذا العقار (مع بناء الجملة ملزم أعلاه) إلى DataGrid ودققت في الممتلكات DataGridColumnHelper.Header في طريقة OnHeaderPropertyChanged وكان قيمة الصحيح (وليس طرح استثناء)

ووأفهم أن الكائن الذي AttachedProperty تعلق يجب أن يكون DependencyProperty. يبحث من خلال العاكس، DataGridColumn (من الذي DataGridTextColumn تستمد) مستمد من DependencyProperty.

ويمكن للشخص يرجى تسليط بعض الضوء على هذا؟ واني اسعى الى توطين طلبنا، وأواجه مشكلة مع في DataGrid. أنا متأكد من أنني يمكن أن تفعل هذا في التعليمات البرمجية الخلفية، ولكن أحاول تجنب ذلك.

هل كانت مفيدة؟

المحلول

وكريس، والمشكلة هي بسيطة جدا، وهذا لن ينجح لأن DataGridTextColumn هو "مستقل" من شجرة البصرية. متجذر الكائن DataGridTextColumn الخاصة بك في جمع أعمدة في DataGrid - انظر المراوغة. وبالتالي فإن الخصائص حتى المرفقة لا تعمل كما هو متوقع. الآن هناك طريقة لجعل كل هذا العمل باستخدام شيء ادعو الربط المرفقة، انظر:

<وأ href = "http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(Part-I).aspx" يختلط = "نوفولو noreferrer" > http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight- (الجزء الأول) .aspx اتصال

وتذكر فقط أن نعلق خصائص ملزمة باستخدام ما هو في VisualTree (حتى الشبكة القابضة العمود ستفعل ما يرام).

وآمل أن يساعد هذا.

نصائح أخرى

وحاول استخدام هذا، والتراسل الفوري على افتراض اسم المستخدم هو خاصية في viewmodel بك

    <Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>

وأنا غير قادر على اختبار السيناريو الخاص بك حتى منصبي هو مجرد فكرة. قد عمل، قد لا.

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