C# CurrentPosition属性未正确更新

C# CurrentPosition属性未正确更新,c#,wpf,listview,binding,wpf-controls,C#,Wpf,Listview,Binding,Wpf Controls,让我再试一次……这是XAML。您可以看到CollectionViewSource、将其用作DataContext的网格、ListView和Delete按钮。发生的情况是,当我单击ListView中的一行时,样式触发器触发以选择ListViewItem,该行被选中。当我单击Delete按钮时,onclick将激发,但CurrentPosition属性设置为-1。阻止更新CurrentPosition属性的原因 XAML 我认为,当触发器触发ListCollectionView的CurrentIte

让我再试一次……这是XAML。您可以看到CollectionViewSource、将其用作DataContext的网格、ListView和Delete按钮。发生的情况是,当我单击ListView中的一行时,样式触发器触发以选择ListViewItem,该行被选中。当我单击Delete按钮时,onclick将激发,但CurrentPosition属性设置为-1。阻止更新CurrentPosition属性的原因

XAML


我认为,当触发器触发ListCollectionView的CurrentItem/CurrentPosition时,发生的情况是没有正确更新。虽然我知道当我点击其中一行中的文本框时可以手动使用的方法,但我不确定是否要这样做。不确定要做什么,我可能只是使用VisualTreeHelper手动定位选定的ListViewItem

IMO,最好在代码中这样设置:

void InitializeDataContext()
{
    var ovens = (from s
                 in dbcontext.Ovens
                 select s).ToList();

    ICollectionView view = new CollectionViewSource
    {
        Source = ovens
    }.View;

    ViewSource = view;
    ovenListView.ItemsSource = ViewSource;
}

您可以在加载的窗口中调用该方法,消除加载的窗口中的其他代码,然后消除绑定,因为您已经在代码中完成了这一切。在视图MVVM中不使用任何代码来设置这一切会更好,但这超出了这个问题的上下文。

做了一些测试,问题在于样式触发器

<Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="IsSelected" Value="True" />
                    </Trigger>

当我单击ListViewItem中的任何内容(即文本框/组合框)时,我使用样式触发器选择ListViewItem。当此触发器就位时,如果我选择了一个文本框,但ListCollectionView的当前位置始终为-1,则行将进行选择。如果我移除触发器并实际选择行本身,在文本框外单击,则CurrentPosition设置正确。我的问题是为什么…我需要手动设置当前位置。感谢您的帮助。

我最终放弃了样式触发器,只处理了ListView行中textbox/combobox的GotFocus事件。在处理程序中,我能够获取ListViewItem并将IsSelected设置为true。像冠军一样工作

private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        Control ctrl = sender as Control;
        ContentPresenter cp = (ContentPresenter)ctrl.TemplatedParent;
        GridViewRowPresenter gp = (GridViewRowPresenter)cp.Parent;
        Grid g = (Grid)gp.Parent;
        ListViewItem lvi = (ListViewItem)g.TemplatedParent;
        lvi.IsSelected = true;
    }

是否确定ListView已绑定到同一集合视图?我们无法从你发布的代码中判断。同意,这里有很多东西可能是错误的。我现在看不出这段代码可能连接到了正确的源代码。我相信是的。该页面在Windows中具有CollectionViewSource。Resources或ViewSource上面显示的ListView位于网格内。如果我还没有给出所有的信息,请告诉我,这个ListView将绑定到它的父对象的任何数据上下文,这是我们无法从这里判断的。如果没有设置,那么就没有什么可绑定的。如果是,那将有助于了解上下文是什么。很抱歉…我已经更新了所有的XAML/C…希望你们能告诉我哪里出了问题:按照建议进行设置,当我选择一个ListItem行时,CurrentPosition仍然被设置为-1。当我第一次打开窗口,不点击任何行,尝试删除第一行时,它被正确设置……CurrentPosition按预期设置为0。当我点击一行并且触发样式触发器时,属性没有得到更新。你根本不需要那个样式触发器。WPF应该使用IsSyncronizedWithCurrentItem和ICollectionView自动处理所有这些。
<Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="IsSelected" Value="True" />
                    </Trigger>
private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        Control ctrl = sender as Control;
        ContentPresenter cp = (ContentPresenter)ctrl.TemplatedParent;
        GridViewRowPresenter gp = (GridViewRowPresenter)cp.Parent;
        Grid g = (Grid)gp.Parent;
        ListViewItem lvi = (ListViewItem)g.TemplatedParent;
        lvi.IsSelected = true;
    }