Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当用户单击“保存”按钮时,才从列表框中删除绑定项_C#_Wpf_Data Binding_Updatesourcetrigger - Fatal编程技术网

C# 仅当用户单击“保存”按钮时,才从列表框中删除绑定项

C# 仅当用户单击“保存”按钮时,才从列表框中删除绑定项,c#,wpf,data-binding,updatesourcetrigger,C#,Wpf,Data Binding,Updatesourcetrigger,我将项目绑定到一个列表框,并且我实现了一个功能,在选中它们并且用户按下delete键时删除它们。目前,delete函数直接访问源。但是,我不想修改源代码,除非用户先单击“保存”按钮 如何修改删除ListBoxItems,以便在用户单击按钮之前不会更新我的源代码 我绑定到的列表 public ObservableCollection<Process> Processes { get; set; } publicobservableCollection进程{get;set;} 删除函

我将项目绑定到一个列表框,并且我实现了一个功能,在选中它们并且用户按下delete键时删除它们。目前,delete函数直接访问源。但是,我不想修改源代码,除非用户先单击“保存”按钮

如何修改删除ListBoxItems,以便在用户单击按钮之前不会更新我的源代码

我绑定到的列表

public ObservableCollection<Process> Processes { get; set; }
publicobservableCollection进程{get;set;}
删除函数

private void OnDeletePressed(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Delete)
    {
        foreach (Process item in ProcessListBox.SelectedItems.OfType<Process>().ToList())
        {
            SelectedRobot.Processes.Remove(item);
        }
    }
}
private void OnDeletePressed(对象发送方,KeyEventArgs e)
{
if(e.Key==Key.Delete)
{
foreach(ProcessListBox.SelectedItems.OfType().ToList()中的流程项)
{
选择机器人。进程。删除(项目);
}
}
}
XAML


一个选项是创建收藏的副本,并保留原件。例如,在初始化过程中的某个地方,调用:

    List<Process> pOriginalList = null;

    pOriginalList = Processes.ToList();



    private void OnDeletePressed(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Delete)
        {
            foreach (Process item in ProcessListBox.SelectedItems.OfType<Process>().ToList())
            {
                this.Processes.Remove(item);
            }
        }
    }

    private void OnSaveClick(object sender, RoutedEventArgs e)
    {
        // do nothing -- Processes already is set
    }

    private void OnCancelClick(object sender, RoutedEventArgs e)
    {
        Processes.Clear();
        Processes = new ObservableCollection<Process>(pOriginalList);
        this.DataContext = null;
        this.DataContext = this;
    }
List poriginalist=null;
poriginalist=processs.ToList();
private void OnDeletePressed(对象发送方,KeyEventArgs e)
{
if(e.Key==Key.Delete)
{
foreach(ProcessListBox.SelectedItems.OfType().ToList()中的流程项)
{
此。处理。删除(项目);
}
}
}
SaveClick上的专用void(对象发送者、路由目标)
{
//不执行任何操作--进程已设置
}
private void OnCancelClick(对象发送方,RoutedEventArgs e)
{
进程。清除();
过程=新的可观察集合(原始列表);
this.DataContext=null;
this.DataContext=this;
}
XAML:



这使得操作在何时需要对源进行实际更新变得明确。注意:不建议这样设置DataContext,只是为了在取消时强制刷新列表。

也许您在流程对象上有一个名为IsDeleted的属性,并在用户单击delete按钮时将其设置为true,然后在用户单击save时将项目从列表中删除?除了@Krishna的注释之外,您还可以在项目模板中添加一个数据触发器(基于
IsDeleted
属性设置为
true
)将项目的可见性设置为
折叠的
,并将父ListBoxItem的
可聚焦的
属性设置为
。这样项目将“消失”“从视图中删除,但仍将在源列表中。@StevenRands另一种方法是绑定到ICollectionView,并在IsDeleted上删除一个筛选器。这样,该项将从UI集合中删除,但仍将在源集合中:)我希望避免复制和重新绑定。似乎应该可以做出在启动UpdateSourceTrigger之前不应用于源代码的更改,就像textbox属性一样。是的,对于大列表,我可以看到这样做的动机。如果尝试删除具有选定索引的ListBox.Items,它将引发异常:{“当ItemsSource正在使用时,操作无效。请改为使用ItemsControl.ItemsSource访问和修改元素。”},它指向绑定源(ItemsSource=Processes)。不确定在不制作副本的情况下执行此操作的方法。如果希望实际项目从列表中消失,请保持原样,但创建另一个列表(removedList),并在删除项目之前将其添加到该列表中。如果单击“保存”,请保持流程不变,否则将项目从removedList添加回流程。这避免了完整副本。使用Krishna建议的方法将需要更多的工作来移除(折叠)列表框中的项,但也将提供一种创建自定义用户控件的方法,该控件将延迟自动更新源。
    List<Process> pOriginalList = null;

    pOriginalList = Processes.ToList();



    private void OnDeletePressed(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Delete)
        {
            foreach (Process item in ProcessListBox.SelectedItems.OfType<Process>().ToList())
            {
                this.Processes.Remove(item);
            }
        }
    }

    private void OnSaveClick(object sender, RoutedEventArgs e)
    {
        // do nothing -- Processes already is set
    }

    private void OnCancelClick(object sender, RoutedEventArgs e)
    {
        Processes.Clear();
        Processes = new ObservableCollection<Process>(pOriginalList);
        this.DataContext = null;
        this.DataContext = this;
    }
<Window x:Class="ListCopy.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <StackPanel>
            <Button Content="Save" Click="OnSaveClick" />
                <Button Content="Cancel" Click="OnCancelClick" />
            </StackPanel>
            <ListBox x:Name="ProcessListBox" ItemsSource="{Binding Processes, UpdateSourceTrigger=Explicit}" KeyDown="OnDeletePressed">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding ProcessName}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        </StackPanel>
    </Grid>
</Window>