DataGrid中的Combobox不显示SelectedItem

时间:2014-06-04 10:44:04

标签: silverlight mvvm datagrid combobox selecteditem

我正在尝试使用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下拉菜单中进行选择,下次打开组合框时,它将被选中。

When the combobox is opened

What I'm looking for when the combobox is opend

此外,当用户从combobox中选择一个项目时,应将其绑定到Datagrid的{​​{1}}的{​​{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