我正在尝试使用MVVM模式学习Silverlight。我偶然发现了一个困扰我几个小时的问题
我在Combobox
内有一个Datagrid
。打开组合框时,在Combobox选项中未选择与SelectedItem
Datagrid
对应的项目。
这是我的模型
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
下拉菜单中进行选择,下次打开组合框时,它将被选中。
What I'm looking for when the combobox is opend
此外,当用户从combobox
中选择一个项目时,应将其绑定到Datagrid
的{{1}}的{{1}}媒体资源。
提前感谢任何有关解决方案的建议或链接。
答案 0 :(得分:0)
[编辑]
我知道可能会出现什么问题......
如何初始化可用城市和地址列表?
因为如果您没有使用相同的实例,您创建了填充可用城市列表以初始化地址,那么SelectedItem
您找不到{{1>} {绑定 {{1>} }} (想想:对象标识)。
所以你应该这样做:
ItemsSource
[原帖]
请尝试删除明确的var cities = InitializeCities(...);
InitializeAddresses( cities );
...
private void InitializeAddresses(... cities)
{
...
var address = new Address {City = cities[42] };
触发器,UpdateSource
不需要它,并且可能会干扰某种方式。
ComboBox