【发布时间】:2014-07-24 23:31:53
【问题描述】:
我正在尝试使用 MVVM 模式学习 Silverlight。我偶然发现了一个困扰我好几个小时的问题
我在Datagrid 中有一个Combobox。打开组合框时,在组合框选项中未选择与Datagrid 的SelectedItem 对应的项目。
这是我的模特
public class Address : ViewModelBase
{
private string streetName;
public string StreetName{...}
private City city;
public City City {...}
}
public class City : ViewModelBase
{
private string cityName;
public string CityName{...}
private string code;
public string Code{...}
}
这是我的 ViewModel
public class MainPageViewModel : ViewModelBase
{
#region Fields
private Address selectedAddress;
#endregion
#region Properties
public ObservableCollection<Address> Addresses { get; set; }
public ObservableCollection<City> Cities { get; set; }
public Address SelectedAddress {...}
#endregion
public MainPageViewModel()
{
InitializeProperties();
}
#region Methods
private void InitializeProperties()
{
InitializeAddresses(...);
InitializeCities(...);
}
#endregion
}
还有我的 XAML
<sdk:DataGrid ItemsSource="{Binding Path=Addresses, Mode=TwoWay}"
SelectedItem="{Binding Path=SelectedAddress, Mode=TwoWay}"
AutoGenerateColumns="False" RowHeight="25" ColumnWidth="*">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="Street Name"
Binding="{Binding Path=StreetName, Mode=TwoWay}"/>
<sdk:DataGridTemplateColumn Header="City Name">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=City.CityName, Mode=TwoWay}"/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="CityName"
ItemsSource="{Binding
RelativeSource={RelativeSource AncestorType=sdk:DataGrid},
Path=DataContext.Cities, Mode=OneWay}"
SelectedItem="{Binding Path=City, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTextColumn Header="City Code"
Binding="{Binding Path=City.Code, Mode=TwoWay}" IsReadOnly="True"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
然后,如果我从combobox 下拉菜单中进行选择,下次我打开 combobx 时,它将被选中。
What I'm looking for when the combobox is opend
此外,当用户从combobox 中选择一个项目时,它应该绑定到Datagrid 的SelectedItem 的City 属性。
提前感谢您提供任何建议或解决方案链接。
【问题讨论】:
-
ViewModelBase是从UIElement还是FrameworkElement派生的? (这两者都是不可取的) -
@Martin
ViewModelBase是一个实现INotifyPropertyChanged接口的类。 -
Binding Path=City...City属性在哪里定义?我希望在您的 ViewModel 中看到它,但只能看到Cities集合。 -
Binding Path=City指向SelectedAddress.City。我相信ComboBox的DataContext是DataGrid的SelectedItem属性。不过我不确定。 -
@Ash:不,不完全是,每一行都有自己的 DataContext(因此每个 ComboBox 都有自己的 DataContext):您在 DataGrid 上设置 ItemsSource,这意味着对于源中的每个项目一行被创建。 ComboBox 位于模板内,该模板为每一行实例化,导致行创建的项目用作 DataContext。
标签: silverlight mvvm datagrid combobox selecteditem