سؤال

لذلك أنا أتعلم WPF الآن، وأريد أن أقوم بقيام قاعدة بيانات بسيطة بين قيمة BOOL، وما إذا كانت أم لا MenuItem ممكن أم لا.

لقد أرجبت ذلك مثل هذا:

<MenuItem Name="miSaveFile" Header="Save" Click="miSaveFile_Click"
IsEnabled="{Binding}" />

وفي ملف .cs I Set:

miSaveFile.DataContext = dataChanged;

لسبب ما MenuItem لا يبدو أنه يعكس بشكل صحيح حالة Datachanged.

ماذا ينقصني؟

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

المحلول

أنت أفضل من الربط كائن من نوع بدائي. غالبا ما يشار إلى هذا الكائن باسم "النموذج" لعرضك.

يستخدم WPF واجهة InotifyPropertychanged للنموذج (أو غالبا ما عرض النموذج) لإعلام طريقة العرض التي قام بها النموذج إلى تغيير الدول.

لذلك سوف ترغب أولا في تحديد فئة بيانات كطراز ينفذ واجهة InotifyPropertyChanged ويقوم بإحرار الحدث الخاص بالمناسبة كلما تم تغيير خاصية.

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

إذا لم تقم بتحديد المصدر، فإنه افتراضي إلى DataContext الخاص بالتحكم يتم تعيين الربط. هناك خيارات أخرى لإعداد المصدر. هنا هي مقالة Microsoft حول إعداد المصدر. يمكنك بعد ذلك تعيين مسار خاصية لسحب المصدر للربط. في حالتك، يكون المصدر منطماطيا ولا يوجد طريق لأن الربط يستخدم كائن المصدر بأكمله.

الهدف هو دائما عنصر التحكم الذي قمت بتعيينه على الربط، والخاصية الهدف هي الخاصية على عنصر التحكم هذا الذي تربطه إليه. في هذه الحالة، menuitem و iSenabled.

يمكن للمحول تحويل القيمة المصدر اختياريا إلى قيمة متوافقة مع الخاصية المستهدفة. يمكنك استخدام أي كائن محول يقوم بتنفيذ IvalueConverter أو ImultivalueConverter (ل Mutlibindings).

في حالتك، أقوم أولا بإنشاء نموذج ينفذ InotifyPropertychanged. بعد ذلك، أود تعيين DataContext من القائمة إلى مثيل النموذج. ثم أود تعيين الربط إلى:

IsEnabled="{Binding Path=EnableFlag}"

(حيث Enableflag هو خاصية Boolean في النموذج الذي تريد القائمة التي تريدها لربطها)

إذا قمت بإعداد واجهة InotifyPropertyChanged بشكل صحيح، فسيتم تمكين / تعطيل عنصر القائمة كلما قمت بتغيير هذه الخاصية هذه على النموذج.

نصائح أخرى

بالنسبة إلى Menuitem، لن يكون هناك نهج أفضل لاستخدام نموذج الأمر بدلا من النقر وخصائص iSenabled؟

بعد البيولوجي ():

this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Save, fileSaveExecuted, fileSaveCanExecute));

طرق إضافية:

/* here is where you set e.CanExecute true for enabled: */
    private void fileSaveCanExecute(object x, CanExecuteRoutedCommandEventArgs e)) { e.CanExecute = ...; e.Handled = true; }
/* here is where you act on the command: */
    private void fileSaveExecuted(object sender, ExecutedRoutedEventArgs e) { ... }

XAML:

<MenuItem Header="_Save" Command="Save"/>

كيف تعرف واجهة المستخدم عند تغيير المتغير Datachanged بالفعل؟

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

لذلك سيكون لدي

<MenuItem Name="miSaveFile" Header="Save" Click="miSaveFile_Click"
IsEnabled="{Binding DataChanged}"</MenuItem>

ثم قم بتعيين MISAVEFILE.DATACONTEXT = myoBject.datachanged (يمكن أن يكون myobject هذا إذا كنت تستخدم CodeBehind)

تحرير: لقد قمت بالتو اختبار سريع. إذا قمت بتعيين سياق البيانات مباشرة إلى خاصية Datachanged، فلن تتم إضافة اشتراك في الحدث الخاص بالمناسبة على كائن المالك. لكن الحل الأقترح يعمل.

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