为什么ComboBox最初没有显示带有IsSelected == true的ComboBoxItem?

时间:2012-05-15 20:19:06

标签: c# wpf combobox

在以下代码中,为什么IsSelected中的属性true设置为ComboBox的项目与ListBox中的Button一样ComboBoxenter image description here

点击<Window x:Class="WpfApplication1.Desktop.Shell" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="350" Width="525"> <StackPanel> <ListBox ItemsSource="{Binding Items}"> <ListBox.Resources> <Style TargetType="ListBoxItem"> <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> </Style> </ListBox.Resources> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <Label Content="{Binding Txt}" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <ComboBox ItemsSource="{Binding Items}"> <ComboBox.Resources> <Style TargetType="ComboBoxItem"> <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> </Style> </ComboBox.Resources> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel> <Label Content="{Binding Txt}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> <Button Content="Select second item" Click="Button_Click" /> </StackPanel> </Window> 后,所选项目将被选中,但之前不会。 enter image description here

XAML:

using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Windows;
using Microsoft.Practices.Prism.ViewModel;

namespace WpfApplication1.Desktop
{
    [Export]
    public partial class Shell : Window
    {
        public class Foo : NotificationObject
        {
            static int _seq = 0;
            string _txt = "Item " + (++_seq).ToString();
            public string Txt { get { return _txt; } }
            bool _isSelected;
            public bool IsSelected
            {
                get { return _isSelected; }
                set
                {
                    _isSelected = value; 
                    RaisePropertyChanged(() => IsSelected);
                }
            }
        }

        public ObservableCollection<Foo> Items { get; set; }

        public Shell()
        {
            Items = new ObservableCollection<Foo>();
            for (int i = 0; i < 5; i++)
                Items.Add(new Foo());
            DataContext = this;
            InitializeComponent();
        }

        void Button_Click(object sender, RoutedEventArgs e)
        {
            Items[1].IsSelected = true;
        }
    }
}

xaml.cs:

{{1}}

3 个答案:

答案 0 :(得分:3)

这是因为只有在生成ComboBoxItem时(即打开下拉列表时)才会应用ItemContainerStyle。

要解决此问题,您需要创建另一个名为SelectedItem的属性,并将Combobox的SelectedValue绑定到它。

Long explanation and example here

答案 1 :(得分:1)

由于绑定默认设置在UpdateSourceTrigger=LostFocus,因此您必须将其更改为PropertyChanged才能获得所需的结果。 像这样:

<Style TargetType="ListBoxItem">
  <Setter Property="IsSelected"Value="{Binding Path=IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</Style>

答案 2 :(得分:0)

当使用模型作为WPF窗口的DataContext时,控件最初可能不会像您期望的那样运行。本质上,在Window初始化之前,一些属性/事件永远不会被设置/调用。在这种情况下,解决方法是在Window的Loaded事件中设置绑定。

免责声明:我没有用OP的特定情况对此进行测试,但这是我过去遇到的行为和解决方法。