【问题标题】:Combobox inside DataGrid not displaying SelectedItemDataGrid内的组合框不显示SelectedItem
【发布时间】:2014-07-24 23:31:53
【问题描述】:

我正在尝试使用 MVVM 模式学习 Silverlight。我偶然发现了一个困扰我好几个小时的问题

我在Datagrid 中有一个Combobox。打开组合框时,在组合框选项中未选择与DatagridSelectedItem 对应的项目。

这是我的模特

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 时,它将被选中。

When the combobox is opened

What I'm looking for when the combobox is opend

此外,当用户从combobox 中选择一个项目时,它应该绑定到DatagridSelectedItemCity 属性。

提前感谢您提供任何建议或解决方案链接。

【问题讨论】:

  • ViewModelBase 是从 UIElement 还是 FrameworkElement 派生的? (这两者都是不可取的)
  • @Martin ViewModelBase 是一个实现INotifyPropertyChanged 接口的类。
  • Binding Path=City ... City 属性在哪里定义?我希望在您的 ViewModel 中看到它,但只能看到 Cities 集合。
  • Binding Path=City 指向SelectedAddress.City。我相信ComboBoxDataContextDataGridSelectedItem 属性。不过我不确定。
  • @Ash:不,不完全是,每一行都有自己的 DataContext(因此每个 ComboBox 都有自己的 DataContext):您在 DataGrid 上设置 ItemsSource,这意味着对于源中的每个项目一行被创建。 ComboBox 位于模板内,该模板为每一行实例化,导致行创建的项目用作 DataContext。

标签: silverlight mvvm datagrid combobox selecteditem


【解决方案1】:

[编辑] 我知道可能出了什么问题... 你如何初始化可用城市列表和地址? 因为如果您没有使用相同的实例,您为填充可用城市列表以初始化地址,那么您绑定的SelectedItemItemsSource 中找不到 strong>(想想:对象身份)。

所以你应该这样做:

var cities = InitializeCities(...);
InitializeAddresses( cities );
...
private void InitializeAddresses(... cities)
{
    ...
    var address = new Address {City = cities[42] };

[原帖] 尝试删除显式 UpdateSource 触发器,ComboBox 不需要它,并且可能会以某种方式干扰。

SelectedItem="{Binding Path=City, Mode=TwoWay}"

【讨论】:

  • @Ash :好的,知道可能导致您的问题的原因,请查看我更新的帖子。
  • 你是对的,这就是问题所在。我没有使用Citiescollection 来初始化Address。我在 Addresses 集合的每个 Address 对象中创建了一个 City 对象的新实例。让我更多地关注对象身份。谢谢一百万。
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2019-11-17
  • 2011-06-26
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多