0

我有一个带有组合框的窗口。这个组合框有 5 个 ComboboxItems。

我将 SelectedItem(组合框)绑定到我的代码隐藏文件中的 ComboBoxSelectedIndex 属性。

在示例中,我希望无法选择项目 4 和 5。

但我可以选择项目 4 和 5。怎么了?

xml代码:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowStartupLocation="CenterScreen"
        Height="350"
        Width="500">
    <StackPanel VerticalAlignment="Center">
        <ComboBox SelectedIndex="{Binding Path=ComboBoxSelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ComboBoxItem>Item 1</ComboBoxItem>
            <ComboBoxItem>Item 2</ComboBoxItem>
            <ComboBoxItem>Item 3</ComboBoxItem>
            <ComboBoxItem>Item 4</ComboBoxItem>
            <ComboBoxItem>Item 5</ComboBoxItem>
        </ComboBox>     
    </StackPanel>
</Window>

代码隐藏文件:

namespace WpfApplication1
{
    public partial class MainWindow : INotifyPropertyChanged
    {
        private int _selectedIndex;

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public int ComboBoxSelectedIndex
        {
            get { return _selectedIndex; }
            set
            {
                if (value < 3)
                {
                    _selectedIndex = value;
                }
                OnPropertyChanged("ComboBoxSelectedIndex");
                Trace.WriteLine(ComboBoxSelectedIndex);
            }
        }

        #region Implementation of INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }
}

(我知道我可以使用 Is Enabled 属性解决这个问题。但我不知道这里是什么)

4

3 回答 3

0

会发生什么:

  • 您选择一个项目。
  • 绑定调用 MainWindow.SelectedIndex.set()
  • OnPropertyChanged 表示属性的更改...但是 WPF 已经在设置此属性,因此该信息被忽略。

这是 WPF 绑定的一个非常痛苦的问题......你可以做的是等待 WPF 完成设置组合框中的属性,然后触发 NotifyPropertyChange。这可以通过在设置器中创建一个新线程来通知调度器线程来完成。

我经常遇到这个问题,并完成了 SelectedItem 和 SelectedIndex 的绑定...经常在两者之间丢失:(

于 2012-08-10T07:13:52.987 回答
0

创建您的自定义组合框来实现这一点

<StackPanel Orientation="Vertical">
    <wpfProj:ExtendedCombobBox 
       SelectedIndex="{Binding Path=ComboBoxSelectedIndex, 
                              Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       MaxSelectedIndex="{Binding Path=MaxSelectedIndex}">
        <ComboBoxItem>Item 1</ComboBoxItem>
        <ComboBoxItem>Item 2</ComboBoxItem>
        <ComboBoxItem>Item 3</ComboBoxItem>
        <ComboBoxItem>Item 4</ComboBoxItem>
        <ComboBoxItem>Item 5</ComboBoxItem>
    </wpfProj:ExtendedCombobBox>
</StackPanel>

并对自定义组合框进行编码

public class ExtendedCombobBox:ComboBox
{
    public static readonly DependencyProperty MaxSelectedIndexProperty =
        DependencyProperty.Register("MaxSelectedIndex", typeof (int), typeof (ExtendedCombobBox), new PropertyMetadata(default(int)));

    public int MaxSelectedIndex
    {
        get { return (int) GetValue(MaxSelectedIndexProperty); }
        set { SetValue(MaxSelectedIndexProperty, value); }
    }

    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if (Items.IndexOf(e.AddedItems[0]) > MaxSelectedIndex)
            e.Handled = true;
        else
            base.OnSelectionChanged(e);
    }
}

UPD1。 或者您可以只使用标准的并订阅 SelectionChanged 事件。但我更喜欢使用 custombobox。

于 2012-08-10T07:37:55.053 回答
0

返回值不是 int32 而是一个字符串。

public string ComboBoxSelectedIndex
    {
        get { return _selectedIndex; }
        set
        {
            if (int.parse(value) < 3)
            {
                _selectedIndex = value;
            }
            OnPropertyChanged("ComboBoxSelectedIndex");
            Trace.WriteLine(ComboBoxSelectedIndex);
        }
    }
于 2016-03-18T14:58:41.627 回答