javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

c#-在ViewModel中使用CollectionViewSource的正确方法

我使用拖放将数据源对象(一个数据库模型)绑定到CollectionViewSource(基本上遵循带WPF的实体框架数据绑定中的此示例。

使用此实现,一切正常。

XAML

<Window.Resources>    
<CollectionViewSource x:Key="categoryViewSource"  
    d:DesignSource="{d:DesignInstance {x:Type local:Category}, CreateList=True}"/>
</Window.Resources>
<Grid DataContext="{StaticResource categoryViewSource}">
..

背后的代码

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   System.Windows.Data.CollectionViewSource categoryViewSource =
      ((System.Windows.Data.CollectionViewSource)(this.FindResource("categoryViewSource")));

  _context.Categories.Load();
  categoryViewSource.Source = _context.Categories.Local;        
}

视图模型

public MainWindow()
{
    InitializeComponent();
    this.DataContext = new MyViewModel();
}

但是,当我尝试在ViewModel中使用相同的代码时,它不起作用(CollectionViewSource不可用),此外,我认为这不是正确的方法(即在MVVM中使用DataBinding)。

我真的很感激能为我指出什么是用DataGrid实现CollectionViewSourceDataBinding的正确方法。

trans by 2020-08-11T21:29:14Z

WPF多个CollectionView具有相同的集合上的不同筛选器

我使用的是ObservableCollection,其中两个ICollectionView用于不同的过滤器。

一种用于按某种类型过滤邮件,另一种用于计数已检查的邮件。如您所见,消息过滤器和消息计数正常,但是当我取消选中消息时,消息将从列表中消失(计数仍在起作用)。

顺便说一句,很抱歉,我的帖子很长,我想包括所有相关内容。

XAML代码:

<!-- Messages List -->
<DockPanel Grid.Row="1"
           Grid.Column="0"
           Grid.ColumnSpan="3"
           Height="500">
  <ListBox Name="listBoxZone"
           ItemsSource="{Binding filteredMessageList}"
           Background="Transparent"
           BorderThickness="0">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <CheckBox Name="CheckBoxZone"
                  Content="{Binding text}"
                  Tag="{Binding id}"
                  Unchecked="CheckBoxZone_Unchecked"
                  Foreground="WhiteSmoke"
                  Margin="0,5,0,0"
                  IsChecked="{Binding isChecked}" />
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</DockPanel>
<Button Content="Test Add New"
        Grid.Column="2"
        Height="25"
        HorizontalAlignment="Left"
        Margin="34,2,0,0"
        Click="button1_Click" />
<Label Content="{Binding checkedMessageList.Count}"
       Grid.Column="2"
       Height="25"
       Margin="147,2,373,0"
       Width="20"
       Foreground="white" />

屏幕截图:enter image description here

码:

/* ViewModel Class */
public class MainViewModel : INotifyPropertyChanged
{

    // Constructor
    public MainViewModel()
    {
        #region filteredMessageList
        // connect the ObservableCollection to CollectionView
        _filteredMessageList = CollectionViewSource.GetDefaultView(messageList);
        // set filter 
        _filteredMessageList.Filter = delegate(object item)
        {
            MessageClass temp = item as MessageClass;

            if ( selectedFilter.Equals(AvailableFilters.All) )
            {
                return true;
            }
            else
            {
                return temp.filter.Equals(_selectedFilter);
            }
        };
        #endregion

        #region checkedMessageList
        // connect the ObservableCollection to CollectionView
        _checkedMessageList = CollectionViewSource.GetDefaultView(messageList);
        // set filter 
        _checkedMessageList.Filter = delegate(object item) { return (item as MessageClass).isChecked; };
        #endregion
    }

    // message List
    private ObservableCollection<MessageClass> _messageList =
            new ObservableCollection<MessageClass>();
    public ObservableCollection<MessageClass> messageList
    {
        get { return _messageList; }
        set { _messageList = value; }
    }

    // CollectionView (filtered messageList)
    private ICollectionView _filteredMessageList;
    public ICollectionView filteredMessageList
    {
        get { return _filteredMessageList; }
    }

    // CollectionView (filtered messageList)
    private ICollectionView _checkedMessageList;
    public ICollectionView checkedMessageList
    {
        get { return _checkedMessageList; }
    }

    // SelectedFilter property
    private AvailableFilters _selectedFilter = AvailableFilters.All; // Default is set to all
    public AvailableFilters selectedFilter
    {
        get { return _selectedFilter; }
        set
        {
            _selectedFilter = value;
            RaisePropertyChanged("selectedFilter");
            _filteredMessageList.Refresh(); // refresh list upon update
        }
    }

    // FilterList (Convert Enum To Collection)
    private List<KeyValuePair<string, AvailableFilters>> _AvailableFiltersList;
    public List<KeyValuePair<string, AvailableFilters>> AvailableFiltersList
    {
        get
        {
            /* Check if such list available, if not create for first use */
            if (_AvailableFiltersList == null)
            {
                _AvailableFiltersList = new List<KeyValuePair<string, AvailableFilters>>();
                foreach (AvailableFilters filter in Enum.GetValues(typeof(AvailableFilters)))
                {
                    string Description;
                    FieldInfo fieldInfo = filter.GetType().GetField(filter.ToString());
                    DescriptionAttribute[] attributes =
                                (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

                    /* if not null get description */
                    if (attributes != null && attributes.Length > 0)
                    {
                        Description = attributes[0].Description;
                    }
                    else
                    {
                        Description = string.Empty;
                    }

                    /* add as new item to filterList */
                    KeyValuePair<string, AvailableFilters> TypeKeyValue =
                                new KeyValuePair<string, AvailableFilters>(Description, filter);

                    _AvailableFiltersList.Add(TypeKeyValue);
                }
            }
            return _AvailableFiltersList;
        }
    }

    #region Implement INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

代码取消检查功能

private void CheckBoxZone_Unchecked(object sender, RoutedEventArgs e)
{
    CheckBox chkZone = (CheckBox)sender;
    ucSystemMessageVM.checkedMessageList.Refresh();
}
trans by 2020-07-27T02:19:39Z

wpf-在CollectionViewSou上触发过滤器

我正在使用MVVM模式在WPF桌面应用程序上工作。

我试图根据TextBox中键入的文本从CollectionViewSource中过滤掉某些项目。我希望在更改文本时对CollectionViewSource进行过滤。

我想知道当过滤器文本更改时如何触发过滤器。

CollectionViewSource绑定到TextBox,后者绑定到我的ViewModel上的CollectionViewSource。 过滤器文本的TextBox应当绑定到ViewModel上的字符串,使用的是UpdateSourceTrigger=PropertyChanged

<CollectionViewSource x:Key="ProjectsCollection"
                      Source="{Binding Path=AllProjects}"
                      Filter="CollectionViewSource_Filter" />

<TextBox Text="{Binding Path=FilterText, UpdateSourceTrigger=PropertyChanged}" />

<ListView DataContext="{StaticResource ProjectsCollection}"
          ItemsSource="{Binding}" />

CollectionViewSource链接到后面代码中的事件处理程序,该事件处理程序仅在ViewModel上调用filter方法。

当FilterText的值更改时完成过滤-FilterText属性的设置器调用FilterList方法,该方法遍历我的ViewModel中的CollectionViewSource,并在每个ViewModel项上设置TextBox FilteredOut属性。

我知道当过滤器文本更改时,FilteredOut属性会更新,但列表不会刷新。 CollectionViewSource筛选器事件仅在我通过切换离开并再次返回来重新加载UserControl时触发。

更新过滤器信息后,我曾尝试致电CollectionViewSource,但这无法解决我的问题。 (“ AllProjects”是CollectionViewSource绑定到我的ViewModel上的TextBox属性。)

FilterText TextBox的值更改时,如何让CollectionViewSource重新过滤自身?

非常感谢

trans by 2020-07-21T18:50:38Z

1 共1页