【问题标题】:Combobox IsEditable breaks my databindingCombobox IsEditable 破坏了我的数据绑定
【发布时间】:2019-07-02 08:40:55
【问题描述】:

我有一个组合框,其中包含一个 ObservableCollection 的项目源

listSites = new ObservableCollection<SiteData>()
        {
            new SiteData("Site 1", true, "HomeAutomation", "Green"),
            new SiteData("Site 2", true, "HomeAutomation", "Green"),
            new SiteData("Site 3", true, "HomeAutomation", "Green"),
            new SiteData("Site 4", false, "HomeAlert", "Red"),
            new SiteData("Site 5", true, "HomeAutomation", "Green"),
            new SiteData("Site 6", true, "HomeAutomation", "Green"),
            new SiteData("Site 7", true, "HomeAutomation", "Green"),
            new SiteData("Site 8", false, "HomeAlert", "Red"),
            new SiteData("Site 9", true, "HomeAutomation", "Green"),
            new SiteData("Site 10", false, "HomeAlert", "Red"),
        };
        cbxSites.ItemsSource = listSites;

Combobox 也有一个指向 StaticResource 的 ItemTemplate:

<ComboBox x:Name="cbxSites" VerticalAlignment="Top" Width="250" Margin="0, 
0, 0, 0" BorderBrush="White"
                  ItemsSource="{Binding listSites}" ItemTemplate=" 
{StaticResource SiteComboBoxItemTemplate}" 
HorizontalContentAlignment="Center"
                      SelectionChanged="CbxSites_SelectionChanged" 
IsEditable="True" />


<DataTemplate x:Key="SiteComboBoxItemTemplate">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
            <materialDesign:PackIcon Kind="{Binding StatusIcon}" 
Width="30" Height="30" Foreground="{Binding StatusColour}"

VerticalAlignment="Center" HorizontalAlignment="Right" />
            <TextBlock Text="{Binding SiteName}" Margin="20, 0, 0, 0" />
        </StackPanel>
    </DataTemplate>

当 ComboBox 上的 IsEditable 设置为 false 时,绑定有效,我可以单击 Combobox 并查看所有名称(站点 1、站点 2、站点 3 等),然后单击一个项目,它会填充相同的名称如您所料,组合框中的名称。当 IsEditable 为真时,组合框的下拉列表仍然正确显示站点名称(站点 1、站点 2、站点 3 等),但是当我选择一个时,而不是在组合框中填充该站点的相同名称,我看到“CipClient.SiteData”代替。为什么会这样,我该如何解决?

【问题讨论】:

标签: c# wpf data-binding


【解决方案1】:

WPF IsEditable=true 用对象填充的 ComboBox 将 ToString() 显示为选定项。 你可以解决这个问题:

<ComboBox x:Name="cbxSites" VerticalAlignment="Top" Width="250" Margin="0, 0, 0, 0" BorderBrush="White"
                  ItemsSource="{Binding listSites}" IsTextSearchEnabled="True" TextSearch.TextPath="SiteName"  ItemTemplate="{StaticResource SiteComboBoxItemTemplate}" HorizontalContentAlignment="Center" SelectionChanged="CbxSites_SelectionChanged" 
IsEditable="true" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2015-09-23
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多