ربط مجموعة Silverlight بـ Combobox في DataForm باستخدام MVVM
-
10-07-2019 - |
سؤال
لدي هذه المشكلة، لدي تطبيق Silverlight مكتوب باستخدام MVVM.أحتاج إلى إنشاء DataForm المرتبط بالخاصية على ViewModel وأريد إضافة ComboBox وتعبئته بقيم من مجموعة أخرى في نفس ViewModel.
شفرة:
<dataFormToolkit:DataForm CurrentItem="{Binding NewUser, Mode=TwoWay}" AutoGenerateFields="False" Height="298">
<dataFormToolkit:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dataFormToolkit:DataField Label="Email">
<TextBox Text="{Binding Email, Mode=TwoWay}"/>
</dataFormToolkit:DataField>
<dataFormToolkit:DataField Label="Język">
<ComboBox ItemsSource="{Binding Path=Languages, Mode=TwoWay}"/>
</dataFormToolkit:DataField>
</StackPanel>
</DataTemplate>
</dataFormToolkit:DataForm.EditTemplate>
</dataFormToolkit:DataForm>
يتم التعامل مع كل هذا بواسطة NewAccountVM الذي يمتلك هذه الخصائص:
private User newUser;
public User NewUser {
get
{
return newUser;
}
set
{
if (value != newUser)
{
newUser = value;
RaisePropertyChanged("NewUser");
}
}
}
private ObservableCollection<Language> languages;
public ObservableCollection<Language> Languages
{
get { return languages; }
set
{
if (languages != value)
{
languages = value;
RaisePropertyChanged("Languages");
}
}
}
الآن، كل هذا يعمل إلى جانب إضافة ItemsSource إلى ComboBox.لقد وجدت العديد من الأمثلة التي توضح كيف تعبأ CB في CodeBehind ، لكن كما قلت ، أريد أن أفعل ذلك على طراز MVVM :) أفهم أن combobox ورثت dataContex = twoway} "لن يعمل ، لكن ليس لدي أي فكرة عن كيفية تحقيق هدفي.
يمكن لأي شخص أن يساعدني؟
المحلول
1) إعلان وviewmodel إلى العرض في قسم الموارد.
<UserControl.Resources>
<local:MyViewModel x:Key="myViewModel" />
</UserControl.Resources>
2) ربط تحرير وسرد لممتلكات المجموعة على viewmodel.
<ComboBox ItemsSource="{Binding Path=Languages,
Source={StaticResource myViewModel},
Mode=TwoWay}"/>
نصائح أخرى
ويمكنك تعيين السياق البيانات في XAML إلى مورد ثابت لديك مثل ذلك:
<UserControl.DataContext>
<Binding Source="{StaticResource myViewModel}" />
</UserControl.DataContext>
السيناريو أ:1.افترض أنك ترغب في ملء مجموعة التحرير والسرد بجميع أدوار العضوية، والسماح للعميل بتحديد الدور وتعيينه للمستخدم:أي.الكائن أ :ASPNET_ROLE IEالكائن ب :مستخدم
دعنا نقول User.MembershipRoleId هو أن تكون ملزمة ل Aspnet_Role.RoleId
يرتبط نموذج البيانات بـ ObjectB
- تتم تعبئة Combobox في نموذج البيانات بالقائمة
في XAML اكتب ما يلي:
<Combobox DisplayMemberPath="RoleName" SelectedValue="{Binding MembershipRoleId,Mode=TwoWay}" SelectedValuePath="RoleId" />
هنا التعيين هو ObjectB.MembershipRoleId=ObjectA.RoleId
السيناريو ب:1.إذا كنت لا ترغب في تعريفها بشكل صريح بالمناسبة في السيناريوهات ، في هذه الحالة ، حدد علاقة أجنبية -برمجي بين الجداول الموجودة في قاعدة البيانات مثل VoreightKey -> user.memberShipId PrimaryKey -> ASPNET_ROLES.ROLEID 2.من ملف ADO.NET (.edmx)، قم بتحديث النموذج من قاعدة البيانات، وستلاحظ ذلك في ملف مستخدم كيان هناك ارتباط على الكيان Aspnet_Roles3.في XAML، اكتب الكود كما هو موضح أدناه لربط combobox بالحقل المطلوب في Dataform
<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />