سؤال

لدي هذه المشكلة، لدي تطبيق 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الكائن ب :مستخدم

  1. دعنا نقول User.MembershipRoleId هو أن تكون ملزمة ل Aspnet_Role.RoleId

  2. يرتبط نموذج البيانات بـ ObjectB

  3. تتم تعبئة Combobox في نموذج البيانات بالقائمة
  4. في 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}" .... />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top