组合框和删除的记录

Combobox and deleted record

我有 2 个相关表 - CarMarks 和 CarMarkGroups。任何 CarMark 都有 CarMarkGroupID。我有 CarMarks 的编辑表单,组合框绑定到 CarMarkGroups。

我将 CarMarkGroup 中的一个标记为已删除的记录。因此,这个标记的 CarMarkGroup 不在绑定到组合框的列表中(因为我必须只显示活动的 CarMarkGroups)。但选中的 CarMark 中的 CarMarkGroupID 仍然 links 标记为已删除的 CarMarkGroup。我不需要更改此 link。

但我需要为选定的 CarMark 显示这条记录,即使它被标记为删除。最佳做法是什么?我需要在 ChangeSelection 事件中为组合框构建列表吗?或者什么?

我不确定我是否完全理解这些连接,但如果您仍然需要在您的 CarMarks ComboBox 中看到 CarMarkGroup,可以在您的 CarMarkGroup 中添加一个布尔标志,例如 ProposedForDeletion 并且当它变为 true 时,您可以更改一些颜色或 GUI 中的其他元素让用户现在建议删除,甚至在某处显示有关此的消息。不要从 ObservableCollection 中删除它,而只是将其标志标记为 true 并将其保留在那里并根据这个新标志进行进一步检查。

我会提出一个基于 ICollectionView 过滤的解决方案。
查看模型:

public class GroupViewModel
{
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
}

public class ItemViewModel
{
    public ItemViewModel(List<GroupViewModel> groups)
    {
        Groups = new ListCollectionView(groups)
        {
            Filter = g =>
            {
                var group = (GroupViewModel)g;

                return !group.IsDeleted || (Group == group);
            }
        };
    }

    public string Name { get; set; }

    public GroupViewModel Group
    {
        get { return group; }
        set
        {
            if (group != value)
            {
                group = value;
                Groups.Refresh();
            }
        }
    }
    private GroupViewModel group;

    public ICollectionView Groups { get; private set; }
}

public class ListViewModel
{
    private readonly List<GroupViewModel> groups;

    public ListViewModel()
    {
        // some sample initialization
        groups = new List<GroupViewModel>
        {
            new GroupViewModel { Name = "Friuts" },
            new GroupViewModel { Name = "Animals" },
            new GroupViewModel { Name = "Trees", IsDeleted = true }
        };

        Items = new List<ItemViewModel>
        {
            new ItemViewModel(groups) { Name = "Orange", Group = groups[0] },
            new ItemViewModel(groups) { Name = "Apple", Group = groups[0] },
            new ItemViewModel(groups) { Name = "Banana", Group = groups[0] },
            new ItemViewModel(groups) { Name = "Cat", Group = groups[1] },
            new ItemViewModel(groups) { Name = "Dog", Group = groups[1] },
            new ItemViewModel(groups) { Name = "Bird", Group = groups[1] },
            new ItemViewModel(groups) { Name = "Oak", Group = groups[2] },
            new ItemViewModel(groups) { Name = "Nut-tree", Group = groups[2] },
            new ItemViewModel(groups) { Name = "Pine", Group = groups[2] },
        };
    }

    public IEnumerable<ItemViewModel> Items { get; private set; }
}

查看(这是 WPF 应用程序项目中的 Window 内容):

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <DataGrid x:Name="ItemsGrid" AutoGenerateColumns="False" ItemsSource="{Binding Items}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Group" Binding="{Binding Group.Name}"/>
        </DataGrid.Columns>
    </DataGrid>

    <ContentControl Grid.Column="1" Content="{Binding SelectedItem, ElementName=ItemsGrid}">
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <ComboBox Height="20" ItemsSource="{Binding Groups}" SelectedItem="{Binding Group}">
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}"/>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>
            </DataTemplate>
        </ContentControl.ContentTemplate>
    </ContentControl>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ListViewModel();
    }
}

因此,当项目被选中时,ComboBox 包含所有未删除的组加上所选项目的组,如果该组被删除。