Combobox SelectionChanged发射两次

时间:2018-04-13 12:50:46

标签: c# wpf combobox datatemplate

我有使用datatemplate的combobox将它连接到数据库但是当项目被选中时它会改变,cmbBase_SelectionChangedchange事件被执行两次我应该如何解决这个问题?

 <ComboBox SelectionChanged="cmbBase_SelectionChanged" x:Name="cmbBase" Height="30" ItemsSource="{Binding School}"
                            SelectedValue ="{Binding SchoolName}" DisplayMemberPath="SchoolName"
                            SelectedValuePath="Id" Margin="10,150,5,0" VerticalAlignment="Top">
                            <ComboBox.Template>
                                <ControlTemplate TargetType="ComboBox">
                                    <Grid>
                                        <ComboBox x:Name="cb" Height="30"
                                            DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                                            ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}}"
                                            SelectedValue ="{Binding SelectedValue, RelativeSource={RelativeSource TemplatedParent}}"
                                            DisplayMemberPath="SchoolName"
                                            SelectedValuePath="Id">
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <StackPanel Orientation="Horizontal">
                                                        <TextBlock Text="{Binding SchoolName}" />
                                                        <TextBlock Text=" - " />
                                                        <TextBlock Text="{Binding Base}" />
                                                        <TextBlock Text=" - " />
                                                        <TextBlock Text="{Binding Year}" />
                                                    </StackPanel>
                                                </DataTemplate>
                                            </ComboBox.ItemTemplate>
                                        </ComboBox>
                                        <TextBlock x:Name="tb" Text="انتخاب کلاس" Margin="3,3,0,0" IsHitTestVisible="False" Visibility="Hidden" />
                                    </Grid>
                                    <ControlTemplate.Triggers>
                                        <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                                            <Setter TargetName="tb" Property="Visibility" Value="Visible" />
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </ComboBox.Template>
                        </ComboBox>

在这里我有我的活动:

 private void cmbBase_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Console.WriteLine("Selected Value is : " + cmbBase.SelectedValue);
        }

这就是outpot:

Selected Value is : 3
Selected Value is : 3

更新

public class School
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long Id { get; set; }

        [Required]
        public string SchoolName { get; set; }

        [Required]
        public string Year { get; set; }

        [Required]
        public string Base { get; set; }

        public string Admin { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

Selectionchanged是一个冒泡的路由事件。 当您在内部组合框中选择一个项目时,我认为selectionchanged将在外部组合中触发。

将组合放入组合中是一个非常糟糕的想法 两个单独的组合框,是的。
一个在另一个里面,没有。你应该做别的事。

总之。
如果您从组合框中解雇了您正在添加处理程序的事件,那么e.originalsource和sender将是相同的。
你可以检查一下。
但是真的 你应该做一些不同的事情。

使用wpf的常用方法是mvvm 这样,您可以将组合框中的selecteditem绑定到viewmodel中的属性。当那里的二传手开火时,你知道用户刚刚选择了不同的东西。并且您不必担心其他一些组合框会触发事件,因为它不会被绑定到该属性。