2015-01-07 2 views
2

Я делаю это приложение, которое извлекает данные из Sharepoint сайта с помощью XML-узла,Фильтрация WPF DataGrid с Textbox

private XmlNode GetListItems(string listTitle) 
    { 
     var client = new Bluejeanware.MWELS.Lists(); 
     System.Net.NetworkCredential passCredentials = new System.Net.NetworkCredential("username", "password", "domain"); 
     client.Credentials = passCredentials; 
     return client.GetListItems(listTitle, string.Empty, null, null, string.Empty, null, null); 
    } 

    public void BindSPDataSource() 
    { 
     var data = GetListItems("Tasks"); 
     var result = XElement.Parse(data.OuterXml); 
     XNamespace z = "#RowsetSchema"; 
     var taskItems = from r in result.Descendants(z + "row") 
         select new 
         { 
          TaskName = r.Attribute("ows_LinkTitle").Value, 
          DueDate = r.Attribute("ows_DueDate") != null ? r.Attribute("ows_DueDate").Value : string.Empty, 
          AssignedTo = r.Attribute("ows_AssignedTo") != null ? r.Attribute("ows_AssignedTo").Value : string.Empty, 
         }; 

     dataGridView.ItemsSource = taskItems; 
    } 

Я хотел бы, чтобы фильтровать данные тянет с Textbox, хороший пример того, что должно быть, это Stackoverflow сообщение

Мне тяжело переводить этот код так, чтобы он работал с тем, как мое приложение добавляет данные в мой Datagrid, любые идеи?

ответ

1

В следующем примере показано, как:

  • получить список данных из SharePoint через веб-служб SharePoint
  • связываются с DataGrid и включить фильтрацию

XAML:

<Window x:Class="SPO.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Tasks" Width="800px" Height="600px" Name="TasksWindow"> 
    <StackPanel DataContext="{Binding ElementName=TasksWindow}"> 
     <TextBox Text="{Binding FilterString, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding ListItemCollection}" /> 
    </StackPanel> 
</Window> 

код позади:

namespace SPO 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      ListItemCollection = CollectionViewSource.GetDefaultView(LoadTasks()); 
      ListItemCollection.Filter = FilterTask; 
     } 


     public bool FilterTask(object value) 
     { 
      var entry = value as TaskEntry; 
      if (entry != null) 
      { 
       if (!string.IsNullOrEmpty(_filterString)) 
       { 
        return entry.TaskName.Contains(_filterString); 
       } 
       return true; 
      } 
      return false; 
     } 

     /// <summary> 
     /// Bind SP Data Source 
     /// </summary> 
     private IEnumerable<TaskEntry> LoadTasks() 
     { 
      var data = GetListItems("http://intranet.contoso.com","Tasks"); 
      var result = XElement.Parse(data.OuterXml); 
      XNamespace z = "#RowsetSchema"; 
      var taskItems = from r in result.Descendants(z + "row") 
          select new TaskEntry 
           { 
            TaskName = r.Attribute("ows_LinkTitle").Value, 
            DueDate = r.Attribute("ows_DueDate") != null ? r.Attribute("ows_DueDate").Value : string.Empty, 
            AssignedTo = r.Attribute("ows_AssignedTo") != null ? r.Attribute("ows_AssignedTo").Value : string.Empty, 
           }; 
      return taskItems; 
     } 


     private XmlNode GetListItems(string webUri,string listTitle) 
     { 
      var client = new Lists.Lists(); 
      client.Url = webUri + "/_vti_bin/Lists.asmx"; 
      return client.GetListItems(listTitle, string.Empty, null, null, string.Empty, null, null); 
     } 



     public ICollectionView ListItemCollection 
     { 
      get { return _listItemCollection; } 
      set { _listItemCollection = value; NotifyPropertyChanged("ListItemCollection"); } 
     } 




     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(string property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 

     public string FilterString 
     { 
      get { return _filterString; } 
      set 
      { 
       _filterString = value; 
       NotifyPropertyChanged("FilterString"); 
       if (_listItemCollection != null) 
       { 
        _listItemCollection.Refresh(); 
       } 
      } 
     } 


     private ICollectionView _listItemCollection; 
     private string _filterString; 

    } 

    public class TaskEntry 
    { 
     public string TaskName { get; set; } 
     public string DueDate { get; set; } 
     public string AssignedTo { get; set; } 
    } 
} 

Результат

enter image description here

0

-Первое определение класса TaskItem для хранения свойств каждого узла в вашем OuterXml.

-Сделать, что ваш ViewModel (или ваш отделенный код, если DataContext установлен в нем) реализует INorifyPropertyChanged интерфейса для распространения изменений в свойствах к UI).

-Тогда превратить вашу taskItems в ObservableCollection собственности TaskItem класса, и определить свойство фильтра, а также что связь с фильтром TextBox.

вот полный код

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     //Populate the TaskItems collection using BindSPDataSource() method 

    } 
    private String _filter = String.Empty; 
    public String Filter 
    { 
     get 
     { 
      return _filter; 
     } 

     set 
     { 
      if (_filter == value) 
      { 
       return; 
      } 

      _filter = value; 
      OnPropertyChanged(); 
      TaskItems = new ObservableCollection<TaskItem>(TaskItems.Where(x => x.AssignedTo.ToLower().Contains(_filter) || 
       x.DueDate.ToLower().Contains(_filter) || 
       x.TaskName.ToLower().Contains(_filter) 
       )); 
     } 
    } 

    private ObservableCollection<TaskItem> _taskItem; 
    public ObservableCollection<TaskItem> TaskItems 
    { 
     get 
     { 
      return _taskItem; 
     } 

     set 
     { 
      if (_taskItem == value) 
      { 
       return; 
      } 

      _taskItem = value; 
      OnPropertyChanged(); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
public class TaskItem 
{ 
    public String TaskName { get; set; } 
    public String DueDate { get; set; } 
    public String AssignedTo { get; set; } 
} 

и Xaml:

<StackPanel> 
    <TextBox Text="{Binding Filter,Mode=TwoWay}" HorizontalAlignment="Stretch"/> 
    <DataGrid ItemsSource="{Binding TaskItems}" AutoGenerateColumns="True"> 

    </DataGrid> 
</StackPanel> 

и не забудьте установить DataContext:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

и, наконец, в конструкторе дон Не заполняйте DataGridItemSource Непосредственно, измените это в BindSPDataSource() метод: dataGridView.ItemsSource = taskItems; к чему-то вроде этого:

TaskItems=new ObservableCollection(taskItems); 
Смежные вопросы