C#,.NET 4.0,VS2010.
WPF新手.我的MainWindow上有一个ComboBox.我挂钩了所说组合框的SelectionChanged事件.但是,如果我检查事件处理程序中组合框的值,它具有旧值.这听起来更像是一个"SelectionChanging"事件,而不是SelectionChanged事件.
如何在选择实际发生后获取ComboBox的新值?
目前:
this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);
...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = this.MyComboBox.Text;
}
Run Code Online (Sandbox Code Playgroud)
注意,如果我使用在事件args,egeOriginalSource中传递的对象,我会得到相同的行为.
是否有一种简单的方法来提示用户确认组合框选择更改,如果用户选择"否",则不处理更改?
我们有一个组合框,更改选择将导致数据丢失.基本上用户选择一种类型,然后他们就能输入该类型的属性.如果他们更改了类型,我们会清除所有属性,因为它们可能不再适用.问题是,在选择之下,您SelectionChanged再次提出事件.
这是一个片段:
if (e.RemovedItems.Count > 0)
{
result = MessageBox.Show("Do you wish to continue?",
"Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (result == MessageBoxResult.No)
{
if (e.RemovedItems.Count > 0)
((ComboBox)sender).SelectedItem = e.RemovedItems[0];
else
((ComboBox)sender).SelectedItem = null;
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个解决方案,我都不喜欢.
用户选择"否"后,删除SelectionChanged事件处理程序,更改所选项目,然后SelectionChanged再次注册事件处理程序.这意味着您必须在类中保留事件处理程序的引用,以便您可以添加和删除它.
创建一个ProcessSelectionChanged布尔值作为类的一部分.始终在事件处理程序的开头检查它.在我们更改选择之前将其设置为false,然后将其重置为true.这将工作,但我不喜欢使用标志基本上使事件处理程序无效.
任何人都有替代解决方案或改进我提到的?
我有一个ListView绑定ItemsSource.为什么SelectionChanged事件在load/databound事件上触发?我认为这是因为选择了'默认'项目,即索引0.
如何禁用此功能,因为选择项目时会更新其他数据源.
谢谢Petrus
我研究了这个并且很难过:我有一个WPF DataGrid,并使用MVVM模型.在某些情况下,我希望阻止更改DataGrid中的行的能力.我研究了这个,并尝试过像这里找到的技术.
在实践中,这是有效的,但是有一个不受欢迎的'闪烁'(它选择点击的行片刻然后回到之前的选择),而这是一个接近的解决方案我希望有一个更优雅的方式,如防止首先是行改变.
我很惊讶没有SelectionChanging或BeforeSelectionChanged所以我可以取消发射的事件; 并强制防止我的视图模型中的索引更改似乎没有任何区别.
我怎样才能做到这一点?
谢谢.
如果我有一个具有SelectionChanged事件的ComboBox,它会在我加载控件时触发.
所以在页面加载时我设置了SelectedValue和SelectionChanged事件,这不是我想要发生的事情.
什么是停止这个的接受的计划?
你能帮我找到这个错误:在加载windows窗体之前触发事件.我开始看到消息Box然后我单击确定,然后它加载主屏幕.之后一切正常,我想知道甚至在加载窗口之前触发ComboBox SelectionChanged事件.FillComboBoxFamilyData(SegmentCode)只是创建一个数据集并将值放在ComboBox中.请参阅此链接以获取完整代码.
任何帮助将非常感谢.谢谢.
<ComboBox Height="23" HorizontalAlignment="Left" Margin="35,26,0,0" Name="comboBox1" VerticalAlignment="Top" Width="205" ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}" DisplayMemberPath="Segment Name" SelectedValuePath="Segment Code" SelectionChanged="comboBox1_SelectionChanged"/>
<ComboBox Margin="304,26,395,93" Name="comboBox2" />
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
MessageBox.Show(comboBox1.SelectedValue.ToString());
SegmentCode = Convert.ToInt32(comboBox1.SelectedValue.ToString());
FillComboBoxFamilyData(SegmentCode);
}
Run Code Online (Sandbox Code Playgroud) 我想在WPF DataGrid元素中处理SelectionChanged事件,仅用于用户交互/选择,如果是由于绑定或其他设置值,则跳过.知道我将如何确定选择是否被用户交互更改?或者任何可以执行类似任务的替代事件?
我正在使用Telerik Slide View控件,它支持一个SelectionChanged事件
private void radSlideView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var addedItems = e.AddedItems;
}
Run Code Online (Sandbox Code Playgroud)
e包含MainViewModel包含该FileName属性的对象.我如何从中"提取"该FileName属性e?addedItems是一种System.Collection.IList类型

在我的应用程序中,我使用DataGridView来显示列表.当用户在datagridview中选择一条记录时,它应该在另一个面板中显示详细信息.为了选择,我被要求使用DataGridView1_SelectionChanged事件.
DataGridView应该只包含一列,但详细信息显示可能包含所选记录的更多信息(我们可以通过查询所选的主键值来获取数据库中的所有详细信息).
请告诉我是否可以获取所选DataGridView记录的datakey(主键).DataGridView是否会基于主键进行绑定?
编辑
我已经实现了DataGridView1.Columns ["ID"].Visible = false.它运作良好.为了选择,我添加了DataGridView1_SelectionChanged事件.
但DataGridView1_SelectionChanged事件多次触发.
这是一个非常简单的问题,当列表视图的选定索引更改时,该事件会触发两次,一次用于取消选择,第二次用于选择下一个项目。
我需要在不同时间选择或取消选择时使用该事件,但是当取消选择只是稍后重新选择时,它会使我的一半用户界面从启用状态闪烁到关闭状态,然后再次打开,它还会导致运行相当多的代码,因此我只需要一种方法来避免取消选择触发,如果单击的是另一个项目而不是空白(用于取消选择)
Dave R 说要在这里使用 100ms 计时器:我是否在 ListView 选择事件处理中遗漏了一些东西 ,这听起来像是可以工作,但看起来很不整洁,或者通常是一种不好的方法。
我唯一的其他想法是使用点击事件,然后在该位置找到该项目?但我不想惹麻烦
提前致谢!
-编辑-
我只是认为单击事件会首先触发,因此我可以设置一个标志,如果单击事件发生在某个项目上,则可以跳过选择索引更改的代码,然后在使用该标志后重置该标志,从而跳过取消选择?我现在会看一下,但再次感觉这不是一种非常有效或简单的方法来完成听起来很简单的事情?
selectionchanged ×10
wpf ×6
c# ×5
combobox ×3
listview ×2
winforms ×2
.net-4.0 ×1
data-binding ×1
datagrid ×1
datagridview ×1
dataset ×1
object ×1
vb.net ×1
xaml ×1