use*_*195 3 c# wpf treeview events
我有一个标准的WPF树视图项目,其中包含许多子项.以编程方式创建树时,我将选定的事件处理程序添加到父项和子项.我发现的是,当子项目选择事件被触发并被处理后,然后触发父事件.这个问题是我根据所选项填充数据网格.因此,每次选择子项后,datagrid都会重置为父项选择.
如果这个项目是正常的,或者我做错了什么以及如何解决它,请有人解释一下.
如果您需要更多信息,请告诉我.
连接事件处理程序:
//parent
TreeViewItem tvi = new TreeViewItem();
tvi.Header = str;
tvi.Selected += CoreSupplierSelected
//child
TreeViewItem tvi = new TreeViewItem();
tvi.Header = str;
tvi.Tag = resinSystems.Values[i];
tvi.Selected += CoreResinSystemSelected;
Run Code Online (Sandbox Code Playgroud)
处理程序:
private void CoreSupplierSelected(object sender, RoutedEventArgs e)
{
TreeViewItem item = e.OriginalSource as TreeViewItem;
MaterialSelectionData thicknessData = editInterface.GetCoreThicknessData(new List<object>() { item.Tag }, null);
List<string> columnNames = thicknessData.DisplayFieldTitles;
columnNames.Insert(0,"");
DataTable dt = GUICommon.DatableConverter.ToDataTable(thicknessData.DisplayData, columnNames);
dtgCores.ItemsSource = dt.AsDataView();
dtgCores.Columns[0].Visibility = System.Windows.Visibility.Collapsed;
}
private void CoreResinSystemSelected(object sender, RoutedEventArgs e)
{
TreeViewItem item = e.OriginalSource as TreeViewItem;
GX3MaterialSelectionData thicknessData = editInterface.GetCoreThicknessData(new List<object>() { ((TreeViewItem)item.Parent).Tag }, new List<object>() { item.Tag });
List<string> columnNames = thicknessData.DisplayFieldTitles;
columnNames.Insert(0, "");
DataTable dt = GUICommon.DatableConverter.ToDataTable(thicknessData.DisplayData, columnNames);
dtgCores.ItemsSource = dt.AsDataView();
e.Handled = true;
dtgCores.Columns[0].Visibility = System.Windows.Visibility.Collapsed;
}
Run Code Online (Sandbox Code Playgroud)
这必须与您的代码有关.我现在正在使用TreeView,子选择不会触发父选择.你可以发布更多的代码吗?也许我可以发现这个问题.
我纠正了.在仔细查看我的代码并运行一些测试之后,这似乎是控件的正常行为.如果您不希望选择冒泡,那么您应该将Handled值设置true为RoutedEventArgs参数.
编辑:
这是我使用的XAML:
<TreeView Width="200" Height="300">
<TreeViewItem Header="Parent" Selected="Parent_Selected">
<TreeViewItem Header="Child" Selected="Child_Selected" />
</TreeViewItem>
<TreeViewItem Header="Parent" Selected="Parent_Selected">
<TreeViewItem Header="Child" Selected="Child_Selected" />
</TreeViewItem>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
和代码:
private void Parent_Selected(object sender, RoutedEventArgs e)
{
bool test = false;
}
private void Child_Selected(object sender, RoutedEventArgs e)
{
bool test = false;
// e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)
如果e.Handled = true声明留下注释,则在选择子对象时Parent_Selected 将触发.