سؤال

أحاول ربط DependancyProperty في واحدة من بلدي usercontrols إلى Width ممتلكات Column في Grid.

لدي رمز مشابهة لهذه:

<Grid x:Name="MyGridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="TitleSection" Width="100" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>...</Grid.RowDefinitions>

    <GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... />
</Grid>

في فصل Usercontrol لدي التاليةDependancyProperty محددة.

public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl));

public int TitleWidth
{
    get { return (int)base.GetValue(TitleWidthProperty); }
    set { base.SetValue(TitleWidthProperty, value); }
}

أنا خلق حالات من Usercontrol في التعليمات البرمجية ، وبالتالي لدي ملزمة البيان مشابهة لهذه :

MyUserControl Cntrl = new MyUserControl(/* Construction Params */);
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay });
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay });
/* Other operations on Cntrl */

أول ملزمة محددة تعمل بشكل خيالي, على الرغم من أن هذا الربط الفعلي UIElement (في هذه الحالة المنزلق), ولكن ملزم "TitleSection" (وهو ColumnDefinition محددة في الشبكة) فشل.وضع نقطة توقف في قانون والقيام مشاهدة على "TitleSection" العوائد المتوقعة الكائن.

أنا بدأت أشك أن x:اسم ان ColumnDefinition لا يمكن أن تكون ملزمة. يمكن لأي شخص أن يقترح كيف يمكن أن تكون قادرة على ربط تغيير عرض العمود الأول في الشبكة ؟

تحرير #1 - للرد على التعليقات

إن ربط البيانات 'فشل' بمعنى أنه مع توقف على واضع على TitleWidth مكان الإقامة باستخدام GridSplitter التحكم في تغيير حجم العمود الأول ، توقف أبدا ضرب.بالإضافة إلى ذلك, رمز أتوقع أن يكون أطلق النار عندما DependancyProperty TitleWidth التغييرات لا تحصل على تنفيذها.

Usercontrol يجري إنشاؤها إضافة إلى Stackpanel داخل الشبكة في Window_Loaded وظيفة.أتوقع أن الشبكة تم تقديمها قبل الوقت Usercontrols يجري بناؤها.بالتأكيد x:اسم ان عنصر TitleSection هو تشبل قيمة 100 عندما يجري بناؤها / قبل ملزم يحدث.

تحرير #2 - من المحتمل أن تفعل شيئا مع هذا ؟

لقد كان وجود شم جولة MSDN صفحات الشبكة ColumnDefinition الوثائق قد تأتي عبر GridLength() ولكن لا أستطيع أن أستوعب كيف يمكن استخدام هذه ملزمة في التعبير.أنا لا يمكن استخدام المرتبطة GridLengthConverter كما المحول في الربط البرمجية لأنها لا تستمد من IValueConverter.

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

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

المحلول

حسنا لدي قليلا من الهمجية العامل ، سوف أشرح لك كيف للأجيال القادمة:

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

عندما العمود الأول هو تغيير لا بد ان تنعكس في usercontrol.أولا حاولت الربط ColumnDefinition ولكن لم يكن يلعب الكرة.

كيف أنا ثابت/Kludged ذلك

في الغيار خلية في العمود الأول أضفت <Label> مع x:اسم لجعلها في متناول.كما هو الحال في خلية لديها الخصائص الافتراضية من 'تمتد' و يملأ الخلية تماما.فإنه يحصل تغيير حجمها كما هو العمود حجمها باستخدام الفاصل.ملزمة العلامة ActualWidth الملكية يعني أن التغييرات في حجم العمود يتم إبلاغ DependancyProperty في columnSpanned usercontrol بشكل صحيح.

الأفكار

من الواضح ، على الرغم من وجود ColumnDefinition ActualWidth الملكية عندما التغييرات لا تظهر على النار PropertyChanged الحدث داخليا (أو هذا أفضل تخمين).قد يكون هذا الخلل ، أو عن طريق تصميم, ولكن بالنسبة لي هذا يعني لقد كان استخدام أقل تنظيف الحل.

نصائح أخرى

هل حاولت إعداد ملزمة في xaml التالية يجب أن تعمل من أجلك.

<ColumnDefinition 
    x:Name="TitleSection" 
    Width="{Binding 
                Path=TitleWidth, 
                RelativeSource={RelativeSource AncestorType=MyUserControl}}" 
    />

وإلا تبحث في الربط البرمجية التي قمت بإدخالها ، يبدو بطريقة خاطئة حول لي الهدف من الربط يجب أن تكون الشبكة العمود المصدر يجب أن يكون الاعتماد على الممتلكات.

أي ما يعادل رمز أعلاه xaml

BindingOperations.SetBinding(TitleSection, ColumnDefinition.WidthProperty,
    new Binding()
    {
        RelativeSource= new RelativeSource(RelativeSourceMode.FindAncestor, typeof(MyUserControl),1),
        Path = new PropertyPath("TitleWidth"),
    });

على صعيد ذات صلة, باستخدام GridSplitter وملزمة عرض العقارات مبنية على الصمت.في أقرب وقت كما يمكنك تغيير حجم العمود باستخدام الخائن ، ملزمة سيتم استبدال قيمة من الخائن.

هذا يشبه ما كنت الخبرة من خلال تحديث أي من الممتلكات التي هي الهدف من ملزمة.عند تعيين الأهداف القيمة مباشرة في التعليمات البرمجية ، أنت esentially استبدال ملزمة كائن مع قيمة العرض.

ColumnDefinition.العرض ليس صحيحا - وهو GridLength.لا يمكنك ربط GridLength مباشرة إلى عدد صحيح, كنت في حاجة الى محول.

وهذا هو أيضا السبب لماذا لا يمكنك ربط أي عنصر تحكم عرض المنشأة (مزدوج) إلى ColumnDefinition عرض المنشأة (GridLength) من دون تحويل.

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