2008-11-17 32 views
3

這其中有我揍;使用WPF工具的DatePicker作爲參數傳遞給作爲的ItemsSource ObjectDataProvider的一個

我有兩個(對於這種情況下是重要的)控制WPF窗口,無論是從在CodePlex上可用的WPF工具; DatePicker和DataGrid。

這個窗口的DataContext設置有它需要的所有信息CLR對象。這CLR對象有大量的數據列表,以及一個名爲GetDataForDate(DateTime的日期),它決定哪些日期,我們將看到數據的方法。

如何創建一個ObjectDataProvider的(我假設將是正確的解決方案)的DataGrid可以綁定到,它提供了訪問)調用帶有的DatePicker的選定日期作爲參數由GetDataForDate(返回的數據?

換句話說,我希望用戶使用日期選擇器選擇一個日期,只要日期更改以反映正確的數據網格應自動更新。

我需要做什麼樣的黑魔法才能達到這樣的效果 - 我猜這應該是一個相對常見的數據綁定方案?

在此先感謝!

回答

6

這是我的完整代碼。我希望這將有所幫助。

的XAML代碼:

<Window x:Class="DataGridSort.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" Height="413" Width="727" 
     x:Name="_this"> 
    <Window.Resources> 
     <ObjectDataProvider ObjectInstance="_this.DataContext" 
          MethodName="GetFromDate" 
          x:Key="odp"> 
      <ObjectDataProvider.MethodParameters> 
       <System:DateTime>2008-01-01</System:DateTime> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <dg:DatePicker Grid.Row="0" x:Name="dtpSource" > 
      <dg:DatePicker.SelectedDate> 
       <Binding Source="{StaticResource odp}" 
         Path="MethodParameters[0]" 
          BindsDirectlyToSource="True" 
          Mode="OneWayToSource"/> 
      </dg:DatePicker.SelectedDate> 
     </dg:DatePicker> 

     <dg:DataGrid x:Name="dtgGrid" 
          ItemsSource="{Binding Source={StaticResource odp}}" 
          AutoGenerateColumns="True" 
          Grid.Row="1"/> 
    </Grid> 
</Window> 

背後的代碼:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     LoadData(); 
    } 

    protected void LoadData() 
    { 
     DataContext = new Data(); 
     ObjectDataProvider odp = this.Resources["odp"] as ObjectDataProvider; 

     odp.ObjectInstance = DataContext; 
    } 
} 

和業務對象:

public class DataItem 
{ 
    public string Name { get; set; } 
    public int BirthYear { get; set; } 
} 

public class Data 
{ 
    private readonly List<DataItem> data; 

    public Data() 
    { 
     data = new List<DataItem>(); 
     data.Add(new DataItem { Name = "John", BirthYear = 2007 }); 
     data.Add(new DataItem { Name = "Mike", BirthYear = 2007 }); 
     data.Add(new DataItem { Name = "Aaron", BirthYear = 2006 }); 
     data.Add(new DataItem { Name = "Bill", BirthYear = 2006 }); 
     data.Add(new DataItem { Name = "Steven", BirthYear = 2005 }); 
     data.Add(new DataItem { Name = "George", BirthYear = 2004 }); 
     data.Add(new DataItem { Name = "Britany", BirthYear = 2004 }); 
    } 

    public List<DataItem> GetFromDate(DateTime dt) 
    { 
     return this.data.Where(d => d.BirthYear == dt.Year).ToList(); 
    } 
} 
1

您可以在DatePicker.SelectedDate屬性上設置OneWayToSource綁定,將文本值推送到ObjectDataProvider MethodParameter中。

首先創建了ObjectDataProvider的:

<ObjectDataProvider ObjectType="{x:Type theObjectType}" 
         MethodName="GetDataForDate" 
         x:Key="odp"> 
     <ObjectDataProvider.MethodParameters> 
      <System:DateTime>2008-01-01</System:DateTime> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

中的DatePicker的selectedDate屬性然後綁定到ObjectDataProvider的:

<dg:DatePicker x:Name="datePicker" > 
    <dg:DatePicker.SelectedDate> 
     <Binding Source="{StaticResource odp}" 
       Path="MethodParameters[0]" 
        BindsDirectlyToSource="True" 
        Mode="OneWayToSource"/> 
    </dg:DatePicker.SelectedDate> 
</dg:DatePicker> 

最後的ObjectDataProvider的綁定到你的ObjectDataProvider:

<dg:DataGrid x:Name="dtgGrid" 
      ItemsSource="{Binding Source={StaticResource odp}}" 
      AutoGenerateColumns="False"/> 
+0

哇,這是..非顯而易見..;)謝謝,我覺得我得到它的要點。然而,我得到了一堆異常,它試圖實例化一個指定類型的對象 - 我怎樣才能讓它使用由我的DataContext表示的非靜態對象? – 2008-11-18 06:02:47

+0

從XAML中刪除ObjectType屬性並將DataContext分配給ObjectInstance。 <窗口x:類= 「DataGridSort.Window1」 ... X:名稱= 「_這個」/> 你應該給一個名字到你的窗口。然後: ... – sacha 2008-11-18 22:23:46

0

如果用INotifyPropertyChanged的像這樣建立自己的等級:

public class MyDataObject : INotifyPropertyChanged 
{ 
    private DateTime _SelectedDate; 
    public DateTime SelectedDate 
    { 
     get 
     { 
      return _SelectedDate; 
     } 
     set 
     { 
      _SelectedDate = value; 
      NotifyPropertyChanged("SelectedDate"); 
      GetDataForDate(); 
     } 
    } 

    private ObservableCollection<YourDataType> _Data; 
    public ObservableCollection<YourDataType> Data 
    { 
     get 
     { 
      return _Data; 
     } 
     set 
     { 
      _Data = value; 
      NotifyPropertyChanged("Data"); 
     } 
    } 

    public void GetDataForDate() 
    { 
     // Your code here to fill the Data object with your data 
    } 


    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

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

    #endregion 
} 

然後你就可以在XAML中創建你的ObjectDataProvider和直接綁定到它。在你的資源:

<ObjectDataProvider x:Key="MyDataSource" ObjectType="{x:Type local:MyDataObject}" /> 

,然後綁定:

<DockPanel> 
    <toolkit:DatePicker SelectedDate="{Binding Path=SelectedDate, Mode=Default, Source={StaticResource MyDataSource}}"/> 
    <toolkit:DataGrid ItemsSource="{Binding Path=Data, Mode=Default, Source={StaticResource MyDataSource}}"/> 
</DockPanel> 
1

有一件事我們應該意識到的是,的DatePicker的selectedDate屬性返回null的日期時間(這意味着:日期時間,而不是隻約會時間)。 我帶來了最多的原因是因爲如果你的方法的簽名包含了一些簡單的DateTime,WPF會返回一個錯誤如圖符文雅各布森,因爲它無法找到正確的方法簽名。

HTH!偉大的文章BTW

相關問題