C# WPF组合框自动选择(如果只有1项)
我有一个组合框,我绑定到一个可观察的集合,该集合会发生更改(根据所选的公司),并且许多公司都有一个帐户(项目),因此我想知道,如果项目资源中只有一个项目,如何最好地使组合框设置SelectedItem,否则将其保留为null,以确保用户选择帐户 目前我这样做的方式是每次更改帐户集合时检查它,如果它只包含一个,则将绑定的选定项属性设置为集合中的第一个项 这似乎很冗长,我需要将其分别实现到每个视图模型中,并为每个组合框编写多达5行代码 下面是我目前正在编写的代码,但我想知道是否可以通过扩展ComboBox控件来实现这一点?如果有人对如何/从哪里开始有任何想法C# WPF组合框自动选择(如果只有1项),c#,wpf,mvvm,controls,combobox,C#,Wpf,Mvvm,Controls,Combobox,我有一个组合框,我绑定到一个可观察的集合,该集合会发生更改(根据所选的公司),并且许多公司都有一个帐户(项目),因此我想知道,如果项目资源中只有一个项目,如何最好地使组合框设置SelectedItem,否则将其保留为null,以确保用户选择帐户 目前我这样做的方式是每次更改帐户集合时检查它,如果它只包含一个,则将绑定的选定项属性设置为集合中的第一个项 这似乎很冗长,我需要将其分别实现到每个视图模型中,并为每个组合框编写多达5行代码 下面是我目前正在编写的代码,但我想知道是否可以通过扩展Combo
public CompanyGermanPower FromCompany
{
get { return _fromCompany; }
set
{
SetField(ref _fromCompany, value, () => FromCompany);
if(value!= null)
{
FromTradeAccountList = new ObservableCollection<TradeAccount>(TradeAccountAdapter.GetTradeAccounts(_session, value.ID));
if (Trade != null && FromTradeAccountList.Count == 1) Trade.TradeAccountFrom = FromTradeAccountList[0];
}
}
} private CompanyGermanPower _fromCompany;
public CompanyGermanPower from company
{
从公司获取{return\u;}
设置
{
设置字段(ref _fromCompany,value,()=>fromCompany);
if(值!=null)
{
FromTradeAccountList=newobserveCollection(TradeAccountAdapter.GetTradeAccounts(_session,value.ID));
如果(Trade!=null&&FromTradeAccountList.Count==1)Trade.TradeAccountFrom=FromTradeAccountList[0];
}
}
}私人公司德国电力公司;
创建一个满足您需求的应用程序应该非常简单。要检测ComboBox中的Items集合何时更改,您需要使用本文中提到的技巧
更新:以下是我的尝试(您需要在项目中添加对System.Windows.Interactivity的引用-您可以从Expression Blend SDK获得它):
使用System.Windows.Interactivity;
公共类SelectFirstItemComboBoxBehavior:Behavior
{
受保护的覆盖无效附加()
{
base.onatached();
(将AssociatedObject.Items作为INotifyCollectionChanged)。CollectionChanged+=HandleCollectionChanged;
}
附加时受保护的覆盖无效()
{
base.OnDetaching();
(将AssociatedObject.Items作为INotifyCollectionChanged)。CollectionChanged-=HandleCollectionChanged;
}
私有无效HandleCollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
if(AssociatedObject.Items.Count==1)
{
AssociatedObject.SelectedItem=AssociatedObject.Items.Cast().First();
}
}
}
以下是您如何使用它:
<Window x:Class="ComboBoxSelectFirstBehavior.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ComboBoxSelectFirstBehavior"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<x:Array x:Key="MyObjects" Type="{x:Type local:MyType}">
<local:MyType Name="WithChildren">
<local:MyType.Children>
<local:MyTypeCollection>
<local:MyType Name="Child1"/>
<local:MyType Name="Child2"/>
<local:MyType Name="Child3"/>
</local:MyTypeCollection>
</local:MyType.Children>
</local:MyType>
<local:MyType Name="WithOneChild">
<local:MyType.Children>
<local:MyTypeCollection>
<local:MyType Name="Child1"/>
</local:MyTypeCollection>
</local:MyType.Children>
</local:MyType>
<local:MyType Name="WithoutChildren">
<local:MyType.Children>
<local:MyTypeCollection>
</local:MyTypeCollection>
</local:MyType.Children>
</local:MyType>
</x:Array>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ComboBox x:Name="FirstCombo" Grid.Row="0" ItemsSource="{StaticResource MyObjects}" DisplayMemberPath="Name"/>
<ComboBox Grid.Row="1" ItemsSource="{Binding ElementName=FirstCombo, Path=SelectedItem.Children}" DisplayMemberPath="Name">
<i:Interaction.Behaviors>
<local:SelectFirstItemComboBoxBehavior/>
</i:Interaction.Behaviors>
</ComboBox>
</Grid>
仅使用XAML:
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Items.Count, RelativeSource={RelativeSource Self}}" Value="1">
<Setter Property="SelectedIndex" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
当然,您可能希望为该样式添加一个键,并将其基于组合框的默认样式,以使其真正有用,但我希望您能明白这一点。谢谢您的建议,will five this a go:)看起来非常有前景,效果非常好,希望我能多次投票支持!伟大的解释和代码!
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Items.Count, RelativeSource={RelativeSource Self}}" Value="1">
<Setter Property="SelectedIndex" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>