Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF组合框自动选择(如果只有1项)_C#_Wpf_Mvvm_Controls_Combobox - Fatal编程技术网

C# WPF组合框自动选择(如果只有1项)

C# WPF组合框自动选择(如果只有1项),c#,wpf,mvvm,controls,combobox,C#,Wpf,Mvvm,Controls,Combobox,我有一个组合框,我绑定到一个可观察的集合,该集合会发生更改(根据所选的公司),并且许多公司都有一个帐户(项目),因此我想知道,如果项目资源中只有一个项目,如何最好地使组合框设置SelectedItem,否则将其保留为null,以确保用户选择帐户 目前我这样做的方式是每次更改帐户集合时检查它,如果它只包含一个,则将绑定的选定项属性设置为集合中的第一个项 这似乎很冗长,我需要将其分别实现到每个视图模型中,并为每个组合框编写多达5行代码 下面是我目前正在编写的代码,但我想知道是否可以通过扩展Combo

我有一个组合框,我绑定到一个可观察的集合,该集合会发生更改(根据所选的公司),并且许多公司都有一个帐户(项目),因此我想知道,如果项目资源中只有一个项目,如何最好地使组合框设置SelectedItem,否则将其保留为null,以确保用户选择帐户

目前我这样做的方式是每次更改帐户集合时检查它,如果它只包含一个,则将绑定的选定项属性设置为集合中的第一个项

这似乎很冗长,我需要将其分别实现到每个视图模型中,并为每个组合框编写多达5行代码

下面是我目前正在编写的代码,但我想知道是否可以通过扩展ComboBox控件来实现这一点?如果有人对如何/从哪里开始有任何想法

    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>