有一个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>
任何人都可以帮忙解决这个问题吗?
答案 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”。
这应该有效!