【问题标题】:WPF : Get particular field from ObservableCollectionWPF:从 ObservableCollection 获取特定字段
【发布时间】:2012-05-18 08:12:51
【问题描述】:

我有一个名为 SeiveList 的 ObservableCollection。我想要列表中的所有 SeiveIdSize(除了最后一个,因为它没有用)并为 Combobox 设置 DataContext。我加了

seiveCmb.DataContext = GlobalUtils.SeiveList;
seiveCmb.DisplayMemberPath = // WHAT SHOULD GO HERE. hOW TO ONLY SHOW SeiveIdSize

// XML 
<ComboBox Name="seiveCmb" ItemsSource="{Binding}"  Grid.Column="1" Grid.Row="1" Margin="2" SelectedIndex="0" ></ComboBox>

根据 Sebastian 的建议进行了编辑: 目前,我刚刚尝试了组合框的列表。 我的Seive类:

public class Seive : INotifyPropertyChanged 
{
   // Other Members
   private bool isSelected;

           public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string p)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(p));
    }
 }

在我的 Window .xaml 文件中:

    <Window.Resources>
    <CollectionViewSource Source="{Binding Path=comboSeives}"
                          x:Key="comboSeivesFiltered"
                          Filter="ComboSeiveFilter">            
    </CollectionViewSource>
</Window.Resources>

 <ComboBox Name="seiveCmb" ItemsSource="{Binding Source={StaticResource         comboSeivesFiltered}}" DisplayMemberPath="SeiveIdSize"
                      Grid.Column="1" Grid.Row="1" Margin="2" SelectedIndex="0"
                      ></ComboBox>

在 Window .cs 文件中:

    public ObservableCollection<Seive> comboSeives { get; set; }

    // Initial original data in Window_Loaded method
    comboSeives = GlobalUtils.SeiveList;

    public void ComboSeiveFilter(object sender, FilterEventArgs e)
    {
        Seive sv = e.Item as Seive;
        // Add items those is != "TOTAL" and isSelected == false
        if (sv.SeiveIdSize != "TOTAL" && sv.IsSelected == false)
            e.Accepted = true;
        else
            e.Accepted = false;
    }

如果 id 为“TOTAL”或 isSelected 为 false(即未添加到网格中),则仅返回 true 并将其添加到其中。初始所有记录都有 isSelected = false。

这是我从this site的解释和帮助中了解到的。并实现了这一点。但是在运行时,我在组合框中看不到任何东西。我试图调试在过滤器方法添加中断,但它从未到达那里。你能指出我在上面的代码中犯错的地方吗?

感谢任何帮助。

谢谢

【问题讨论】:

  • 你累了吗seiveCmb.DisplayMemberPath = "SeiveIdSize";
  • 你能展示SeiveList的示例元素吗?
  • @nemesv,是的,还添加了 DisplayMemberPath。如果是 xaml,请参见组合框。但还没有结果。
  • @StaWho,我不明白你所说的示例元素是什么意思。 SeiveList 的内容是:GlobalUtils.SeiveList.Add(new Seive("+10")); GlobalUtils.SeiveList.Add(new Seive("+8")); GlobalUtils.SeiveList.Add(new Seive());在窗口的构造函数中添加。当我调试时,我看到 comboSeives = GlobalUtils.SeiveList; comboSeives 里面也有 3 个项目。所以东西被添加进去了。在 ComboSeiveFilter 中,我只添加了 e.Accepted = true,但根本不会触发该方法——在该方法中添加了一个中断。

标签: wpf combobox field observablecollection datacontext


【解决方案1】:

我了解您希望过滤您的收藏,删除一个元素。一种方法是在您的 Window.Resources 中创建一个 CollectionView 并应用一个过滤器方法 - 如 here 所演示和解释的那样。

<Window.Resources>
    <CollectionViewSource Source="{Binding Path=SeiveList}"
                          x:Name="seiveListFiltered"
                          Filter="MyFilter">

    </CollectionViewSource>
</Window.Resources>

您的代码暗示在您的情况下,集合是窗口的 DataContext。这必须更改以匹配您的新资源:

<ComboBox ItemsSource="{Binding Source={StaticResource seiveListFiltered}}"/>

请注意,这将使用类似于 SeiveItem.ToString() 方法的输出的项目填充 ComboBox(实际上,我不知道项目的类名)。使用DisplayMemeberPath-Property 设置要显示的属性名称。

<ComboBox DisplayMemberPath="SeiveIdSize" ItemsSource="{Binding Source={StaticResource seiveListFiltered}}"/>

【讨论】:

  • 好答案 - 优于使用 linq 等在代码中进行过滤,我正在考虑一秒钟 :)
  • @Sebastian,非常感谢。有了这个资源,我正在寻找更多的东西。我有包含所有 Seive obj 数据的 SeiveList。我有一个部分,您可以在其中选择 seiveId(组合框),添加其详细信息,然后该数据将列在数据网格中。将数据添加到网格后,我希望将 seiveId 从组合列表中删除。当从网格中删除记录时,应该再次将 seiveId 添加到组合列表中。这就是我要寻找的。这将减少我的验证,以密切关注添加了哪个 id。你也可以指导我吗?
  • @Tvd,这很简单。首先,给您的 Seive obj(或包装它的 ViewModel)一个属性“IsAdded”。然后生成两个 CollectionViewSources:一个过滤掉 IsAdded==true 和相同值为 false 的。将您的组合框绑定到一个集合,将 DataGrid 绑定到另一个。请注意,您的 Seive 对象必须实现 INotifyPropertyChanged 过滤器才能注意到值的变化。因此,每当您更改 IsAdded 时,过滤器都会执行其操作,并且 UI 会收到 CollectionChanged 事件。
  • @SebastianEdelmeier,请看一下添加的代码。正如你提到的,我已经实施了,但我没有看到任何结果。你能指出我哪里错了吗!请帮帮我。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-07-24
  • 2020-12-17
  • 2018-09-04
  • 2021-07-22
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多