我有这个问题,我已经使用MVVM编写了Silverlight应用程序。我需要创建绑定到ViewModel属性的DataForm,我想添加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");
}
}
}
现在,除了将ItemSource添加到ComboBox之外,所有这些都有效。我发现很多例子显示如何在CodeBehind中填充CB,但就像我说我想在MVVM-Style中这样做:) 据我所知,ComboBox从DataForm继承了DataContext,而这个ItemsSource =“{Binding Path = Languages,Mode = TwoWay}”将不起作用,但我不知道如何实现我的目标。
有人能帮助我吗?
答案 0 :(得分:6)
1)将viewmodel声明为资源部分中的视图。
<UserControl.Resources>
<local:MyViewModel x:Key="myViewModel" />
</UserControl.Resources>
2)将ComboBox绑定到viewmodel上的collection属性。
<ComboBox ItemsSource="{Binding Path=Languages,
Source={StaticResource myViewModel},
Mode=TwoWay}"/>
答案 1 :(得分:0)
您可以将XAML中的数据上下文设置为静态资源,如下所示:
<UserControl.DataContext>
<Binding Source="{StaticResource myViewModel}" />
</UserControl.DataContext>
答案 2 :(得分:0)
情景A: 1.假设您希望使用所有成员资格角色填充组合,并允许客户端选择角色并分配给用户: 即ObjectA:Aspnet_Role 即ObjectB:用户
让我们说 User.MembershipRoleId 将绑定到 Aspnet_Role.RoleId
Dataform绑定到ObjectB
在XAML中写下以下内容:
<Combobox DisplayMemberPath="RoleName"
SelectedValue="{Binding MembershipRoleId,Mode=TwoWay}" SelectedValuePath="RoleId" />
这里的映射是,ObjectB.MembershipRoleId = ObjectA.RoleId
情景B: 1.如果您不想通过ScenarioA中的方式显式定义,那么在这种情况下,在数据库中的表之间定义一个ForeignKey-PrimaryKey关系 ForeignKey - &gt; User.MembershipId PrimaryKey - &gt; Aspnet_Roles.RoleId 2.从ADO.NET(.edmx)文件中,从数据库更新模型,您将观察到在用户实体中,实体与 Aspnet_Roles 之间存在关联。 3.在XAML中,编写如下代码以将组合框绑定到Dataform的所需字段
<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />