【问题标题】:WPF ComboBox prevent event on select item by codeWPF ComboBox通过代码阻止选择项目上的事件
【发布时间】:2015-11-10 11:54:57
【问题描述】:

我在 EDIT 2 中重新表述了我的问题

所有,我在 WPF 中有一个组合框。当我设置 SelectedIndex 属性时,它会触发一个 SelectionChanged 事件,这是正确的行为。但是我想要的是让 ComboBox 在我以编程方式设置 SelectedIndex 属性时不会触发事件。有办法吗?

我正在使用 .Net 4.5

编辑 1:代码

public void AddLocation()
{
    List<String> locations = new List<String>();

    //LocationBox is the name of ComboBox
    LocationBox.ItemsSource = locations;

    locations.Add("L1");
    locations.Add("B1");
    locations.Add("B3");
    LocationBox.SelectedIndex = 2; //<-- do not want to raise SelectionChanged event programmatically here
    locations.Add("G1");
    locations.Add("G2");
    locations.Add("F1");
    locations.Add("F3");
}

private void LocationBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Console.WriteLine(LocationBox.SelectedIndex);
}

编辑 2:改写问题

我想在 ComboBox 中静默选择一个项目,即无需用户交互(使用代码/以编程方式),因此它不会触发 SelectionChanged 事件。我该怎么做?

【问题讨论】:

  • 当您选择特定索引时,您希望组合框不起作用?
  • 当我以编程方式选择特定索引时,ComboBox 会触发 SelectionChanged 事件。在我的代码中,我不希望在特定情况下这样做。另一方面,当用户与 ComboBox 交互时,它应该触发 SelectionChanged 事件
  • 着火了?我不明白..如果你解释容易理解的话,我可以帮助你:) 你应该上传你的源代码
  • 火是Raise的同义词。触发事件意味着引发事件。为了您的方便,我添加了源代码。
  • 只是好奇,如果你不想提高它,你为什么首先添加处理程序?您添加它但不想使用它的具体场景是什么?

标签: c# .net wpf


【解决方案1】:

对此答案的警告:

  • 这太骇人听闻了。
  • 这很糟糕。

我让你怀疑你可能正处于修改现有代码的两难境地(或者可能是其他一些原因)。给定示例代码,您可以通过此代码完成您想要实现的目标:

// Remove the handler
LocationBox.SelectionChanged -= LocationBox_SelectionChanged;
// Make a selection...
LocationBox.SelectedIndex = 2; //<-- do not want to raise SelectionChanged event programmatically here
// Add the handler again.
LocationBox.SelectionChanged += LocationBox_SelectionChanged;

【讨论】:

  • 刚刚回答了你上面的问题。
  • 我其实也有同样的想法,要删除和添加处理程序,我有点不愿意使用这种方法。
  • 如果你有处理程序,当你做选择时不可能没有 if raise。我认为这就是它的设计方式。根据您对我上面问题的回复,我认为您可以在 VM 级别而不是在 View 级别实现它。但我认为这需要另一个问题。
  • 由于时间限制,我会采用这种方法。
  • 好吧,与您的结果相比。我宁愿通过 IsInitializing 标志来环绕 SelectedIndex 设置。我猜同样的技巧,但影响较小
【解决方案2】:

我的猜测是你在初始化组合时试图不触发事件。您可以使用 DataBinding 来做到这一点。下面有一个示例,但您可以搜索 MVVM 模式以获取更多详细信息。

XAML:

<ComboBox ItemsSource="{Binding CBItems}"
          SelectedIndex="{Binding SelectedCBItem}" />

CS:

public class ModelExample : INotfyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int selectedCBItem;
    public int SelectedCBItem
    {
        get { return selectedCBItem; }
        set
        {
            selectedCBItem = value;
            NotifyPropertyChanged(nameof(SelectedCBItem));
        }
    }

    private List<ComboBoxItem> cbItems;
    public List<ComboBoxItem> CBItems
    {
        get { return cbItems; }
        set
        {
            cbItems= value;
            NotifyPropertyChanged(nameof(CBItems));
        }
    }

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

public class ExampleWindow
{
    ...

    private ModelExample Model;

    private void Initialize()
    {
        ...
        this.DataContext = Model = new ModelExample();

        List<ComboBoxItem> items = // initialize your items somehow
        items.Add(new ComboBoxItem() { Content = "dummy item 1" });
        items.Add(new ComboBoxItem() { Content = "dummy item 2" });

        Model.CBItems = items;
        Model.SelectedCBItem = 1;
    }
}

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2020-03-20
    • 2016-11-30
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多