【问题标题】:unable to select listbox item through data template in WPF无法通过 WPF 中的数据模板选择列表框项目
【发布时间】:2011-11-09 00:56:10
【问题描述】:

我无法从列表框中选择所需的项目 (当我单击该列表框中的任何项目时,会选择多个项目,但不会选择我单击的项目)。所选项目的背景颜色也将更改为默认(白色)颜色。 我使用的Xaml代码如下:

<ListBox x:Uid="lst_value" Name="lstValues" Background="Wheat"
    BorderBrush="Black" HorizontalAlignment="Left" VerticalAlignment="Top"
    BorderThickness="1" Height="100" Width="150" ItemsSource="{Binding listval}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Background="Wheat">
                <TextBlock x:Name="txtblk" Foreground="Black" FontSize="10"
                    TextAlignment="Left" FontWeight="Black" Text="{Binding}"
                    Background="Wheat"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

谁能告诉我如何解决这个问题。

【问题讨论】:

    标签: wpf xaml listbox


    【解决方案1】:

    如果我理解你的问题,那么列表框的选择逻辑反应很奇怪。对吧?

    在大多数情况下,此类行为与您的项目(listVal 枚举中的对象)的 Equals() 或/和 GetHashCode() 方法有关。确保列表中没有多个对象对一个对象的 Equals() 调用返回 true。还要确保,您没有返回 GetHashCode() 变化值(一些随机值)的对象。

    如果您在上述方法中发现了问题(我假设为 Equals),但您必须说您无法更改 Equals() 的实现,请考虑为您的项目创建一个包装器对象(一个 ViewModel)。

    【讨论】:

    • @soma sekhar:如果您的 listVal 枚举中有相等的对象,则选择逻辑存在选择哪个项目的问题。相等性由 Equals() 方法检查。因此,请确保列表中没有多个通过相等方法比较相等的对象。例如。如果您插入两个相同的字符串或两个相同的整数值,则选择的反应会很奇怪。
    • 非常感谢,我可以解决它...,你是对的,我一直在列表集合中插入相同的字符串..出于测试目的..现在如果我输入不同的字符串..它工作..谢谢。
    • 哦!!..现在我无法从列表框中选择多个项目...请告诉我为什么会这样...!!:-(
    • @soma sekhar:你设置 SelectionMode = System.Windows.Controls.SelectionMode.Multiple 了吗?
    • yap..我已经扩展了...现在我可以选择单个项目或多个项目..谢谢..:-)
    【解决方案2】:

    如果我没记错的话,listval 是 List&lt;string&gt; 或任何其他原始类型列表。 它与您的案例相关的原因是原始类型是结构而不是类。

    不要使用原始类型列表,而是尝试使用具体类

    假设您正在使用 List 之类的名称列表..

    创建一个具有 name 属性的类

    class person
    {
    public string Name{get;set;} 
    }
    

    使用List可以绑定name属性

    【讨论】:

    • 我以同样的方式实现了它。其中“listval”是通过“observablecollection”类检索到的get属性......
    • 如果它是一个 observablecollection" 类,那么你的文本块是如何直接绑定的(Text="{Binding}")......为什么它没有绑定到任何属性......?可以将部分发布到您的视图模型,这将有助于我们提供更好的答案
    • 我可以解决它..我正在将相同的字符串插入到列表集合中..现在,我尝试使用不同的字符串,我可以正确选择项目..
    • 如果您确定将来不会在该列表中获得任何相同的字符串,那么您可以将此视为修复,否则请考虑使用 List 具体类代替字符串。因为所有原始类型都是结构的(在你的情况下是字符串)..
    • 谢谢你......但是,当使用 List 类时,我根本无法将项目绑定到列表框......
    【解决方案3】:

    您不应在StackPanelTextBlock 上设置Background,这会混淆选择。要覆盖选择的背景,请将资源添加到您的 ListBoxItems。

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Style.Resources>
                <!-- Selected Brush -->
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green" />
                <!-- Selected but out of focus Brush -->
                <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LightGreen" />
            </Style.Resources>
            <!-- If you must set a Background, do it here, should be superfluous though as the ListBox.Background is the same -->
            <Setter Property="Background" Value="Wheat" />
        </Style>
    </ListBox.ItemContainerStyle>
    

    如果您的源集合包含相同的对象(例如具有相同值的字符串),则可能会出现选择问题。

    【讨论】:

    • 非常感谢,我可以解决它...,我一直在列表集合中插入相同的字符串..出于测试目的..现在如果我输入不同的字符串..它的工作..谢谢你。
    • 昨天有人做了同样的事情:)
    • 哦!!..现在我无法从列表框中选择多个项目...请告诉我为什么会这样...!!
    • @somasekhar: 把ListBox.SelectionMode改成Multiple为例,默认是Single)
    • 太酷了..我把它扩展了,现在我可以选择单个或多个..我明白了...太好了。谢谢..:-)
    【解决方案4】:

    就我而言,我错误地将 ComboBoxItems 添加到 ListBox.Items 集合中。将“ListBoxItem”以外的对象添加到 Items 集合会导致我出现这种行为。

    【讨论】:

      猜你喜欢
      • 2018-12-09
      • 2011-11-08
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多