如何在不使用ItemsSource的情况下将ComboBox绑定到WPF中的字符串值?

时间:2017-08-09 08:06:37

标签: c# wpf combobox

我有一个ComboBox,在只读模式下用于显示单个值(字符串)并被禁用,这是当前的实现:

<ComboBox Name="cmbSalesDocuments" SelectedValuePath="SalesDocumentId" SelectedValue="{Binding Path=SalesDocumentId, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True,NotifyOnValidationError=True}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding SalesDocumentAName}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

在这种模式下,我不打算用与写模式对象相同的对象绑定它,而是绑定到一个包含字符串属性SalesDocumentAName的更轻的对象。问题是,我无法在不使用需要ItemsSource对象的IEnumerable集合的情况下将Displayed和Selected值设置为该属性。

3 个答案:

答案 0 :(得分:1)

您可以编写IValueConverter以从单个项目中获取集合

public class ObjectToCollectionConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = new List<object>();
        if (value != null)
        {
            collection.Add(value);
        }
        return collection;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

现在您可以将ComboBox

绑定
<ComboBox 
    ItemsSource="{Binding SalesDocumentAName,Converter={StaticResource ObjectToCollectionConverter}" 
    SelectedItem="{Binding SalesDocumentAName, Mode=OneWay}" 
    IsReadOnly="true"/>

答案 1 :(得分:0)

您无法将ComboBox绑定到string值。 ItemsSource属性只能绑定到IEnumerable。您可以删除string中的IEnumerableControlTemplate以外的所有项目。

另一种选择是使用另一个控件或修改ComboBoxTextBlock不是a.anyState, a.anyState:hover, a.anyState:focus { //css code...... } ,除非您将其看作是一个。{/ p>

答案 2 :(得分:0)

如果您没有设置ItemsSource,则可以添加一个ComboBoxItem,其内容设置为轻量级对象:

<ComboBox Name="cmbSalesDocuments" SelectedValuePath="SalesDocumentId" 
          SelectedValue="{Binding Path=SalesDocumentId, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,NotifyOnValidationError=True}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding SalesDocumentAName}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>

    <ComboBox.Items>
        <ComboBoxItem Content="{Binding Path=SalesDocument}" 
                      ContentTemplate="{Binding ItemTemplate, ElementName=cmbSalesDocuments}"/>
    </ComboBox.Items>
</ComboBox>

注意:ItemsSource或Items - 一次只能使用一个属性