我查看了几个相关的答案,并确定我可以通过设置lstData.SelectedIndex = -1以编程方式清除选择;但是,当我在启动时设置数据上下文后立即执行此操作时,它会以某种方式工作并设置为选择列表中的第一个元素。
我也尝试将设置添加到XAML中,-1实际上是Visual Studio的默认值,但除非您设置它,否则它实际上不在XAML中。即:
<ListView Margin="6,6,6,203"
IsSynchronizedWithCurrentItem="True"
x:Name="lstData"
ItemsSource="{Binding}"
SelectionChanged="lstData_SelectionChanged"
HorizontalContentAlignment="Right"
ItemContainerStyle="{StaticResource ItemContStyle}"
SelectedIndex="-1">
但这也没有效果。
另外,令人着迷的是,如果我把lstData.SelectedIndex = 3;在我的LoadData方法中,它将在选择第三个成员的情况下开始设置。
这是我的相关窗口加载代码:
public Window1()
{
InitializeComponent();
// Set start and end dates to day after tomorrow, and
// the next day, by default:
StartDate = DateTime.Now.AddDays(1);
EndDate = StartDate.AddDays(2);
txtStartDate.Text = StartDate.ToShortDateString();
txtEndDate.Text = EndDate.ToShortDateString();
LoadData();
}
public void LoadData()
{
App.RefreshMembers();
App.CalculateNeededMeals(StartDate, EndDate);
// Bind the ListBox to our ObserveableCollection
LayoutRoot.DataContext =
App.db.PFW_Members.OrderBy("FullName",true).OrderBy("CancelDate",true);
lstData.SelectedIndex = -1;
}
在其他情况下调用LoadData(),在这种情况下,它会清除选择。只是不是窗口第一次加载。好像,有一些初始化线程没有真正完成,并且如果在启动时它为-1,则将选择设置为0.
哦,是的,我确实有一个选择更改处理程序,但它不会改变选择,即:
private void lstData_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (lstData.SelectedItem == null)
{
btnReactivate.IsEnabled = false;
btnDeactivate.IsEnabled = false;
}
else
{
if (((PFW_Member)lstData.SelectedItem).CancelDate == null)
{
btnReactivate.IsEnabled = false;
btnDeactivate.IsEnabled = true;
}
else
{
btnReactivate.IsEnabled = true;
btnDeactivate.IsEnabled = false;
}
}
}
是否有某种方法可以让它真正等到装载,然后做东西,或设置延迟事件或某事,或者有人知道或理论可能会发生什么?
感谢您的任何提示!
答案 0 :(得分:7)
设置IsSynchronizedWithCurrentItem =“False”。这将是解决它的最简单方法。
这里发生的是:在所有内容都被初始化之后(即在构造函数之后),Bindings将启动。此时将设置ListBox的ItemsSource。在此步骤中,一些ICollectionView魔术发生在幕后。实质上,ListBox将连接到源集合的默认CollectionView,其CurrentItem属性始终默认为第一个项目。现在,如果IsSynchronizedWithCurrentItem为true,则ListBox将更新SelectedItem以使其等于ICollectionView.CurrentItem。这就是造成你提到的问题的原因。
(注意:在所有这些发生之后,Loaded事件将被触发。因此,dnr3在Loaded事件中设置SelectedIndex = -1的注释也应该有效。)
希望这是有道理的。