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

时间:2018-03-14 07:49:47

标签: wpf xaml mvvm

有一个ListBox,它的ItemsSource绑定到一个集合, 我们需要在更改绑定时始终选择第一个项目,例如,首先ListBox有3个项目,第二个项目是用户从ListBox中选择的,更改了绑定后,ListBox有1个项目,但是还选择了第二个项目。(还有第二项是emty但不隐藏)

<ListBoxItem x:Name="item1">
                        <Border Margin="0" >
                            <Image   Source="{Binding  Selected.List[2].Image,NotifyOnTargetUpdated=True}" ></Image>
                        </Border>
                    </ListBoxItem>
                    <ListBoxItem x:Name="item2">
                        <Border Margin="0">
                            <Image   Source="{Binding  Selected.List[1].Image,NotifyOnTargetUpdated=True}"></Image>
                        </Border>
                    </ListBoxItem>
                    <ListBoxItem x:Name="item3">
                        <Border Margin="0">
                            <Image   Source="{Binding  Selected.List[0].Image,NotifyOnTargetUpdated=True}"></Image>
                        </Border>
                    </ListBoxItem>

任何人都可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

您正在静态添加xaml中的项目。请在视图模型中创建一个集合属性,将其绑定到项目源,并在视图模型中绑定列表框的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)));
        }
    }
}

答案 1 :(得分:-1)

首先为更改绑定创建一个事件,并在change_event函数中设置索引

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

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

答案 2 :(得分:-1)

首先,您是否有任何特定的理由在xaml中添加ListBoxItem 如果没有,请使用observable collection绑定到列表框的Itemsource属性。

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

同时设定,
xaml中列表框上的IsSynchronizedWithCurrentItem =“True”。

这应该有效!