Связывание разных объектов для разных TreeView на основе связывания одного и того же класса

В настоящее время у меня есть класс myCommand

class myCommand : INotifyCollectionChanged , INotifyPropertyChanged
{
    public string Name { get; set; }
    public ObservableCollection<myFile> subCommand { get; set; }
}

У меня есть два элемента TreeView в моем окне. tvCommandList, содержащий все доступные команды, и tvFinalList, содержащий все выбранные команды.

Я использовал contextmenu, чтобы скопировать элементы из tvCommandList в tvFinalList; В mainWindow у меня есть два элемента ObservableCollection, которые связаны с TreeViewItems.

    ObservableCollection<myCommand> cmdlist = null;
    ObservableCollection<myCommand> finallist = null;

Они привязаны к TreeView в файле XAML.

<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <Style x:Key="styleTemplate" TargetType="TreeViewItem">
                <Setter Property="IsSelected" Value="{Binding IsInitiallySelected, Mode=TwoWay}" />
            </Style>
            <HierarchicalDataTemplate DataType="{x:Type data:myCommand}" 
                                      ItemsSource="{Binding subCommand, Mode=TwoWay}">
                <TextBlock Text="{Binding Name, Mode=TwoWay}" />
            </HierarchicalDataTemplate>
        </ResourceDictionary>
    </Grid.Resources>
</Grid>

<TreeView x:Name="tvSendList" ItemsSource="{Binding}" DataContext="{Binding cmdlist}">
<TreeView x:Name="tvRecvList" ItemsSource="{Binding}" DataContext="{Binding finallist}">

Я копирую TreeViewItem из cmdlist в finallist и редактирую их для настройки данных. Проблема, с которой я столкнулся, заключается в том, что если я изменяю элемент (обновляю значение Name) в finallist, элемент cmdlist также обновляется. , что я не уверен, как решить эту проблему.

Я попытался переместить ResourceDictionary в каждый TreeView конкретно, но все еще сталкивался с той же проблемой.


person Joseph    schedule 16.04.2020    source источник


Ответы (1)


Вы также должны клонировать, т.е. создавать копию каждого отдельного объекта myFile при создании копии коллекции, например:

finalist = new ObservableCollection<myFile>(cmdlist.Select(x => new myFile()
{
    Property1 = x.Property1,
    Property2 = x.Property2
    //copy all property values...
}));
person mm8    schedule 16.04.2020
comment
Спасибо. Это решило проблему для меня. Клонирование каждого объекта при присоединении ко второй коллекции устранило проблему.!! - person Joseph; 16.04.2020