0

在下面的代码中,为什么属性IsSelected设置为的项目没有像单击后一样true被选中? ComboBoxListBoxButton在此处输入图像描述

一旦我点击ComboBox,选定的项目就会被选中,但不是之前。 在此处输入图像描述

xml:

<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>

xml.cs:

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;
        }
    }
}
4

3 回答 3

3

这是因为 ItemContainerStyle 仅在生成 ComboBoxItems 时应用(即当您打开下拉菜单时)。

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

长的解释和例子在这里

于 2012-05-15T21:22:12.567 回答
1

因为绑定是UpdateSourceTrigger=LostFocus默认设置的,所以您必须将其更改为PropertyChanged以获得您想要的结果。像这样:

<Style TargetType="ListBoxItem">
  <Setter Property="IsSelected"Value="{Binding Path=IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</Style>
于 2012-05-15T20:47:06.503 回答
0

将模型用作DataContextWPF 窗口时,控件最初的行为可能与您预期的不同。本质上,某些属性/事件在 Window 初始化之前永远不会被设置/调用。在这种情况下,解决方法是在 Window 的Loaded事件中设置绑定。

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

于 2012-05-15T20:46:56.510 回答