我有使用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; }
}
答案 0 :(得分:0)
Selectionchanged是一个冒泡的路由事件。 当您在内部组合框中选择一个项目时,我认为selectionchanged将在外部组合中触发。
将组合放入组合中是一个非常糟糕的想法
两个单独的组合框,是的。
一个在另一个里面,没有。你应该做别的事。
总之。
如果您从组合框中解雇了您正在添加处理程序的事件,那么e.originalsource和sender将是相同的。
你可以检查一下。
但是真的
你应该做一些不同的事情。
使用wpf的常用方法是mvvm 这样,您可以将组合框中的selecteditem绑定到viewmodel中的属性。当那里的二传手开火时,你知道用户刚刚选择了不同的东西。并且您不必担心其他一些组合框会触发事件,因为它不会被绑定到该属性。