MVVM을 사용하여 DataForm에서 Silverlight Bind Collection
-
10-07-2019 - |
문제
이 문제가 있습니다. MVVM을 사용하여 Silverlight 앱을 작성했습니다. ViewModel의 속성에 부드러운 데이터 폼을 만들어야하며 Combobox를 추가하고 동일한 뷰 모델의 다른 컬렉션의 값으로 채우고 싶습니다.
암호:
<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");
}
}
}
이제이 모든 것은 Combobox에 ItemsSource를 추가하는 것 외에 작동합니다. CodeBehind에서 CB를 채우는 방법을 보여주는 많은 예를 찾았지만 MVVM 스타일 로이 작업을하고 싶다고 말했듯이 :) 이해합니다. : ComboBox는 DataForm에서 DataContext를 상속 받았으며이 ItemsSource = "{바인딩 경로 = 언어, 모드입니다. = twoway} "는 작동하지 않지만 목표를 달성하는 방법은 모르겠습니다.
누군가 나를 도울 수 있습니까?
해결책
1) 뷰 모델을 리소스 섹션의 뷰로 선언합니다.
<UserControl.Resources>
<local:MyViewModel x:Key="myViewModel" />
</UserControl.Resources>
2) Combobox를 뷰 모델의 수집 특성에 바인딩합니다.
<ComboBox ItemsSource="{Binding Path=Languages,
Source={StaticResource myViewModel},
Mode=TwoWay}"/>
다른 팁
XAML의 데이터 컨텍스트를 다음과 같은 정적 자원으로 설정할 수 있습니다.
<UserControl.DataContext>
<Binding Source="{StaticResource myViewModel}" />
</UserControl.DataContext>
시나리오 A :1. 모든 멤버십 역할로 콤보를 채우고 클라이언트가 역할을 선택하고 사용자에게 할당하도록 허용합니다. IE Objecta : ASPNET_ROLE IE OBJECTB : 사용자에게 할당하십시오.
말합시다 user.membershiproleid 묶여 있어야합니다 aspnet_role.roleid
DataForm은 ObjectB에 바인딩됩니다
- Dataform의 Combobox에는 목록이 채워져 있습니다
XAML에서 다음을 작성하십시오.
<Combobox DisplayMemberPath="RoleName" SelectedValue="{Binding MembershipRoleId,Mode=TwoWay}" SelectedValuePath="RoleId" />
여기서 매핑은 ObjectB.Membershiproleid = Objecta.roleid입니다
시나리오 B :1. 시나리오에서 명시 적으로 정의하지 않으려면이 경우 외국 키와 같은 데이터베이스의 테이블 사이의 외국 키 프리마리 키 관계를 정의합니다. ado.net (.edmx) 파일, 데이터베이스에서 모델을 업데이트하면 사용자 엔티티 엔티티에 대한 협회가 있습니다 aspnet_roles3. XAML에서 Combobox를 바인딩하기 위해 아래와 같이 코드를 작성하십시오.
<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />