好的,这一定是一个重复的问题,但我找不到答案: 我有一个数据集到数据集的列表框。默认情况下,选择项目[0]。我如何防止这种情况,以确保在我单击ListBoxItem时提出SelectionChanged事件?
编辑: 我已经解除了SelectedIndex = -1路由,但我再次尝试:在Listbox的构造函数中将SelectedIndex设置为-1(或作为XAML中的属性)不起作用。似乎在初始化之后填充了列表框,并且selectedIndex将在all.Same故事之后变为0,用于将SelectedItem设置为null;
我试过了:
<ListBox ItemsSource="{Binding Value}"
SelectionChanged="ListBox_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
Loaded="ListBox_Loaded">
</ListBox>
使用:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.AddedItems.Count==0)return;//Prevents stackoverflow! ;-)
((ListBox)e.OriginalSource).SelectedItem=null;
}
private void ListBox_Loaded(object sender, RoutedEventArgs e)
{
((ListBox) sender).SelectedItem = null;
}
这样可行,但它会在列表框显示的项目顶部插入一个空白行,这非常难看...... 在我的特定情况下,我可以通过删除IsSynchronizedWithCurrentItem属性来解决问题。
但我可以想到许多不可接受的情况。
以上语句是无意义的:要么您想使用主 - 细节绑定,要么将IsSynchronizedWithCurrentItem设置为true,否则您不想。您不太可能想要使用主 - 细节绑定,然后列表框中没有当前选定的项目始终
答案 0 :(得分:6)
运行一些测试后,ListBox的默认行为是不预先选择列表中的项目。删除IsSynchronizedWithCurrentItem =“True”将确保列表框未预先选择,并且当用户点击任何项目时将引发SelectionChanged事件。
如果确实将IsSynchronizedWithCurrentItem设置为true,则意味着selectedIndex将始终等于ListBox.Items的ListBox.Items.CurrentItem的索引。 ListBox.Items总是有一个CurrentItem,由于CurrentItem或CurrentIndex是只读的,所以不能设置为-1或null。
希望有所帮助 Ĵ
编辑...刚刚阅读
“在我的特定情况下,我可以通过删除IsSynchronizedWithCurrentItem属性来解决问题。但我可以想到许多情况,这是不可接受的。”
在这种情况下,由于上述原因,我认为不可能。
答案 1 :(得分:2)
listbox.selectedIndex = -1
那应该取消选择所有内容(因为索引-1不存在),但据我所知,除非你明确设置默认的selectedItem,否则生成列表视图时没有选择任何内容,因此SelectedIndex可能已经被无意中设置了某个点。请注意,SelectedIndex也可以在XAML中设置。
答案 2 :(得分:2)
将CollectionView用作列表框的ItemsSource。一个新的WPF项目,最初未选择任何项目:
XAML:
<Window x:Class="ListBoxDataBinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<ListBox
ItemsSource="{Binding Path=Value, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
SelectionChanged="ListBox_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
>
</ListBox>
</Grid>
</Window>
CS:
public partial class Window1: Window {
public IEnumerable Value {
get { return (IEnumerable)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(IEnumerable), typeof(Window1), new UIPropertyMetadata(null));
public Window1() {
InitializeComponent();
var view = new TheCollectionView();
view.MoveCurrentTo(null);
this.Value = view;
}
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
MessageBox.Show("Selection changed");
}
}
public class TheCollectionView: CollectionView {
public TheCollectionView(): base(new TheCollection()) {
}
}
public class TheCollection: List<string> {
public TheCollection() {
Add("string1");
Add("string2");
Add("string3");
}
}
答案 3 :(得分:1)
您需要将索引设置为-1,这会告诉列表框不要选择任何内容。在SelectionChanged事件中,将列表框的Index属性设置为-1。
希望这有帮助, 最好的祝福, 汤姆。
答案 4 :(得分:1)
如何转储SelectionChanged事件处理程序和数据绑定依赖项属性或将属性通知给SelectedValue呢?
答案 5 :(得分:1)
只需转到列表框的属性。选择数据选项卡,然后选择绑定列。输入-1,该条目将自动更改为65535。
接下来将“允许值列表编辑”属性更改为“否”。最后将“锁定”属性更改为“否”。
现在您的用户无法在列表中选择一个项目,从而避免了对该项目的反向视频。
答案 6 :(得分:0)
您可以使用Tap事件代替SelectionChanged:
<ListBox ItemsSource="{Binding Data}" Tap="ListBox_Tap" ... />