1

我在数据网格中有一个组合框,我将一个可观察的集合绑定到该组合框。

Xaml

<UserControl x:Class="DDCScheduler.View.DDCSchedule"
...
...
<DataGrid x:Name="ScheduleDataGrid" 
                  ItemsSource="{Binding ScheduleCollection}"
                  CanUserResizeColumns="True" 
                  AutoGenerateColumns="False"
                  IsReadOnly="True">
    <DataGridTemplateColumn Header="Holidays" Width="Auto">
         <DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
                 <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource 
                     FindAncestor, AncestorType={x:Type my:DDCSchedule}}, 
                     Path=DataContext.NationalHolidayCollection}"
                     DisplayMemberPath="HolidayCategoryName"
                     SelectedValue="{Binding NationalHoliday, 
                       UpdateSourceTrigger=PropertyChanged}">
                  </ComboBox>
              </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

代码背后

public partial class DDCSchedule : UserControl, INotifyPropertyChanged
{
    private ObservableCollection<Schedule> _scheduleCollection = 
        new ObservableCollection<Schedule>();
    private ObservableCollection<NationalHoliday> _nationalHolidayCollection;

    public ObservableCollection<NationalHoliday> NationalHolidayCollection
    {
        get { return _nationalHolidayCollection; }
        set
        {
            if (Equals(value, _nationalHolidayCollection)) return;
            _nationalHolidayCollection = value;
            OnPropertyChanged("NationalHolidayCollection");
        }
    }

    public ObservableCollection<Schedule> ScheduleCollection
    {
        get { return _scheduleCollection; }
        set
        {
            if (Equals(value, _scheduleCollection)) return;
            _scheduleCollection = value;
            OnPropertyChanged("ScheduleCollection");
        }
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        if (_isScreenLoaded)
            return;
        this.DataContext = this;
        _isScreenLoaded = true;
    }

哪个工作正常。直到我介绍了以下内容:

    private void MenuItem_Settings_OnClick(object sender, RoutedEventArgs e)
    {
        SettingsModalWindow window = new SettingsModalWindow();
        window.ShowDialog();

        if (window.DialogResult != true)
            return;

        //Assign newly created national holiday collection.
        NationalHolidayCollection = window.NationalHolidayCollection;
    }

Schedule.cs(Datagrid 的 ItemSource 模型)

public class Schedule : INotifyPropertyChanged
{
    private NationalHoliday _nationalHoliday;

    public NationalHoliday NationalHoliday
    {
        get { return _nationalHoliday; }
        set
        {
            if (Equals(value, _nationalHoliday)) return;
            _nationalHoliday = value;
            OnPropertyChanged("NationalHoliday");
        }
    }
    ...
}

SettingsModalWindow 在设置窗口中生成一个新的 ObservableCollection 实例。一旦我将新创建的 observablecollection 分配给已经绑定的集合,datagrid 中 ComboBoxes 中所有先前选择的值都会被清除(但列表会使用新绑定的集合进行更新)。

这是一种可以理解的行为,因为代码正在从设置中分配一个新创建的 observablecollection,这样 SelectedValue 就不再引用同一个对象。

我的问题是,解决这个问题的优雅方法是什么?这不像我可以将我的模型更改为值类型而不是引用类型来克服这个问题。

编辑:

这些是显示我的问题的一些屏幕截图。所以我目前有两行在组合框中设置了假日 A、B。

在此处输入图像描述

然后我进入设置,并添加更多假期(设置中的 ObservableCollection),这些假期将显示在组合框中。

在此处输入图像描述

一旦我按下确认,一个新创建的 ObservableCollection 就会返回并分配到打开设置模式窗口的用户控件中。一旦分配完成,每个组合框都会被清除。(但是当我单击组合框时,新创建的集合已正确绑定)

在此处输入图像描述

4

1 回答 1

0

ObservableCollection如果您将其全部覆盖,则使用毫无意义,只需编辑其内容即可。我什至从来没有为这些集合属性提供设置器。

(实现说明:您可以记录CollectionChanged对话框中的所有事件并将其修改应用于原始集合)

于 2013-08-23T17:38:36.253 回答