根据转换器的条件在 ComboBox 中显示不同的值

Display different values in ComboBox based on a conditional from converter

我有一个组合框,它应该根据条件显示不同的值。

如果 SelectedValue 的属性 NameEmail 不为空且不为空,我想显示它们。

如果上述情况不成立,我想回退并显示 SelectedValue 的 Username,这永远不会为 null 或空。

这是我目前所拥有的。

<ctrls:RadComboBoxExtended Grid.Row="0" Grid.Column="1" ItemsSource="{Binding CurrentValue.LIST_OF_USERS}" SelectedValue="{Binding CurrentValue.User}" focus:FocusExtension.IsFocused="{Binding Focuspoint}">
    <ctrls:RadComboBoxExtended.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Visibility>
                    <MultiBinding Converter="{StaticResource MultiNullOrEmptyStrToVisibility}" ConverterParameter="1">
                        <Binding Path="Name"/>
                        <Binding Path="Email"/>
                    </MultiBinding>
                </TextBlock.Visibility>
                <Run Text="{Binding Name}"/>
                <Run Text="("/><Run Text="{Binding Email}"/><Run Text=")"/>
            </TextBlock>
        </DataTemplate>
    </ctrls:RadComboBoxExtended.ItemTemplate>
</ctrls:RadComboBoxExtended>

上方 XAML 正确显示了具有 NameEmail 的所有用户。

我将如何为此显示“else 分支”?截至目前,不符合我的转换器条件的用户在 ComboBox 中为空白。我怎样才能显示这些?

最简单的方法是用 StackPanelGrid 包围 TextBlock 并在那里放另一个 TextBlock,设置 ConverterParameter="10" 并处理它,这样只有 TextBlock 之一可见。
另一种可能性是使用 ItemTemplateSelector 来定义如果 RadComboBoxExtended 有这样的 属性.

应该使用哪个 DataTemplate
<ctrls:RadComboBoxExtended Grid.Row="0" Grid.Column="1" ItemsSource="{Binding CurrentValue.LIST_OF_USERS}" SelectedValue="{Binding CurrentValue.User}" focus:FocusExtension.IsFocused="{Binding Focuspoint}">
    <ctrls:RadComboBoxExtended.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock>
                    <TextBlock.Visibility>
                        <MultiBinding Converter="{StaticResource MultiNullOrEmptyStrToVisibility}" ConverterParameter="1">
                            <Binding Path="Name"/>
                            <Binding Path="Email"/>
                        </MultiBinding>
                    </TextBlock.Visibility>
                    <Run Text="{Binding Name}"/>
                    <Run Text="("/><Run Text="{Binding Email}"/><Run Text=")"/>
                </TextBlock>
                <TextBlock Text="{Binding Username}">
                    <TextBlock.Visibility>
                        <MultiBinding Converter="{StaticResource MultiNullOrEmptyStrToVisibility}" ConverterParameter="10">
                            <Binding Path="Name"/>
                            <Binding Path="Email"/>
                        </MultiBinding>
                    </TextBlock.Visibility>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ctrls:RadComboBoxExtended.ItemTemplate>
</ctrls:RadComboBoxExtended>

我会在 ViewModel 中选择姓名+电子邮件还是用户名。 (ViewModel的职责之一是以方便的格式为View提供数据)

public string SelectionText => String.IsNullOrEmpty(Name) && String.IsNullOrEmpty(Email) 
                               ? Username 
                               : $"{Name} ({Email})" ;

不需要更短的 DataTemplate 和 MultiValueConverter

<ctrls:RadComboBoxExtended Grid.Row="0" Grid.Column="1" ItemsSource="{Binding CurrentValue.LIST_OF_USERS}" SelectedValue="{Binding CurrentValue.User}" focus:FocusExtension.IsFocused="{Binding Focuspoint}">
    <ctrls:RadComboBoxExtended.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding SelectionText}"/>
        </DataTemplate>
    </ctrls:RadComboBoxExtended.ItemTemplate>
</ctrls:RadComboBoxExtended>