Wpf 更改绑定时始终从列表框中选择第一项

Wpf 更改绑定时始终从列表框中选择第一项,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,有一个列表框,它的ItemsSource绑定到一个集合, 当绑定被更改时,我们需要始终选择第一项,例如,在第一个ListBox中有3项,第二项由用户从ListBox中选择,在绑定被更改之后,ListBox有1项,但第二项仍然被选中。(第二项是emty,但未隐藏) 有人能帮助解决这个问题吗?首先为更改绑定创建一个事件,并在“更改事件”功能中设置索引 private void AddEventHandler() { myListBox.BindingContextChanged += ne

有一个列表框,它的ItemsSource绑定到一个集合, 当绑定被更改时,我们需要始终选择第一项,例如,在第一个ListBox中有3项,第二项由用户从ListBox中选择,在绑定被更改之后,ListBox有1项,但第二项仍然被选中。(第二项是emty,但未隐藏)



有人能帮助解决这个问题吗?

首先为更改绑定创建一个事件,并在“更改事件”功能中设置索引

private void AddEventHandler()
{
   myListBox.BindingContextChanged += new EventHandler(BindingContext_Changed);
}

private void BindingContext_Changed(object sender, EventArgs e)
{
   myListBox.SelectedIndex = 0;
}

首先,在xaml中添加ListBoxItem有什么具体原因吗。
如果没有,请使用observable集合绑定到listbox的Itemsource属性

还将ListBox的selected item属性绑定到viewmodel的属性。
更改集合后,将viewmodel的“绑定选定项”属性设置为第一项

同时设置,
IsSynchronizedWithCurrentItem=“True”在xaml的列表框中


这应该管用

您正在静态地在xaml中添加项。请在视图模型中创建集合属性,将其绑定到items源,并在视图模型中绑定listbox的SelectedItem属性,如下所示:

<ListBox ItemsSource="{Binding ItemCollection}"
         SelectedItem="{Binding SelectedItem}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <!-- bind to item properties here -->
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

每当设置ItemCollection属性时,视图模型也可以设置其SelectedItem属性:

public class Item { ... }

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private IEnumerable<Item> itemCollection;
    public IEnumerable<Item> ItemCollection
    {
        get { return itemCollection; }
        set
        {
            itemCollection = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(ItemCollection)));

            SelectedItem = itemCollection.FirstOrDefault(); // here
        }
    }

    private Item selectedItem;
    public Item SelectedItem
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(SelectedItem)));
        }
    }
}
公共类项{…}
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私人IEnumerable itemCollection;
公共IEnumerable ItemCollection
{
获取{return itemCollection;}
设置
{
itemCollection=值;
PropertyChanged?调用(此,
新属性ChangedEventArgs(名称(ItemCollection));
SelectedItem=itemCollection.FirstOrDefault();//此处
}
}
私有项目selectedItem;
公共项目选择项
{
获取{return selectedItem;}
设置
{
选择editem=值;
PropertyChanged?调用(此,
新属性ChangedEventArgs(名称(SelectedItem));
}
}
}

您可以向我们展示一些代码吗?您正在静态地在xaml中添加项。请在视图模型中创建集合属性,将其绑定到items源,并在视图模型中绑定listbox的SelectedItem属性,并在每次绑定更改时将其更新为collection.First()。只要不绑定项源,静态添加的项将始终存在。@Raviraj Palvankar,太好了,非常感谢,问题是关于WPF,而不是WinForms。除此之外,
SelectedIndex=1
将选择第二项。
public class Item { ... }

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private IEnumerable<Item> itemCollection;
    public IEnumerable<Item> ItemCollection
    {
        get { return itemCollection; }
        set
        {
            itemCollection = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(ItemCollection)));

            SelectedItem = itemCollection.FirstOrDefault(); // here
        }
    }

    private Item selectedItem;
    public Item SelectedItem
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(SelectedItem)));
        }
    }
}