[英]c# MVVM update Datagrid after combobox selection
我正在創建一個小的wpf程序,該程序可以按日期過濾數據集。 最終它將對數據進行分組和求和,但此刻我正試圖顯示數據行。 我想要一個窗口,頂部有一個ComboBox
,可以選擇日期,並且一個DataGrid
顯示正確的記錄。 我已將ComboBox
綁定到可能的日期列表,並且已將標簽綁定到ComboBox
更新的值。 當我從ComboBox
選擇一個值時,此標簽將更新。 但是,我無法讓DataGrid
更新以顯示新數據。
DataSet
傳遞給ViewModel構造函數,該構造函數提取兩個DataTables
。 一個用於創建ObservableCollection<DateTime>
以便綁定到ComboBox
的項(通過WorkItemsDates
)。 另一個用於DataGrid
進行存儲,以通過過濾(並最終進行分組/求和等)屬性WorkItems
進行綁定。 ComboBox
綁定到DateTime
SelectedDate
。 該標簽還綁定到SelectedDate
以確保它由ComboBox
更新。
Xaml視圖如下:
<Window ...>
<DockPanel>
<ComboBox DockPanel.Dock="Top"
ItemsSource="{Binding WorkItemsDates}"
SelectedItem="{Binding SelectedDate, Mode=TwoWay}"
ItemStringFormat="ddd d MMM yyyy"
IsSynchronizedWithCurrentItem="True" />
<Label DockPanel.Dock="Bottom"
Content="{Binding SelectedDate, FallbackValue=99/99/9999}"
ContentStringFormat="dd MM yyyy" />
<DataGrid Name="TimeTotalsDataGrid" AutoGenerateColumns="True"
ItemsSource="{Binding WorkItems, Mode=OneWay}"
IsSynchronizedWithCurrentItem="True" ></DataGrid>
</DockPanel>
</Window>
后面的代碼:
public partial class TheView: Window
{
public UserControl1(DataSet tigerDataSet)
{
InitializeComponent();
DataContext = new TimeTotalsDateSelectorViewModel(tigerDataSet);
}
}
ViewModel如下:
internal class TimeTotalsDateSelectorViewModel
{
private ObservableCollection<DateTime> _workItemsDates;
private DataTable _workItems;
private DateTime _selectedDate;
public TimeTotalsDateSelectorViewModel(DataSet tigerDataSet)
{
if (tigerDataSet == null)
throw new ArgumentNullException("workItemsDates");
if (tigerDataSet.Tables["WorkItemsDates"] == null)
throw new ArgumentNullException("tigerDataSet.Tables[WorkItemsDates]");
if (tigerDataSet.Tables["WorkItems"] == null)
throw new ArgumentNullException("tigerDataSet.Tables[WorkItems]");
_workItems = tigerDataSet.Tables["WorkItems"];
_workItemsDates = new ObservableCollection<DateTime>();
foreach (DataRow row in tigerDataSet.Tables["WorkItemsDates"].Rows)
{
_workItemsDates.Add((DateTime)row["FinishDate"]);
}
SelectedDate = _workItemsDates[0];
}
public ObservableCollection<DateTime> WorkItemsDates
{
get { return _workItemsDates; }
}
public DateTime SelectedDate
{
get { return _selectedDate; }
set { _selectedDate = value; }
}
public DataTable WorkItems
{
get
{
DataRow[] _workItemsToShow = _workItems.Select("FinishTime>='" + _selectedDate.ToString() + "' AND FinishTime<'" + _selectedDate.AddDays(1).ToString() + "'");
return _workItemsToShow.Count() != 0 ? _workItemsToShow.CopyToDataTable() : null;
}
}
第一件事,因為您正在使用MVVM
,所以您將必須通過實現INotifyPropertyChanged
接口來通知您的屬性。
其次,您還必須從SelectedItem
屬性的Setter
通知您的WorkItems
屬性,以便當您從下拉列表更改日期時,它還將更新DataGrid
的ItemsSource
。
在SelectedDate的設置器中,調用獲取網格值的代碼。 您還應該實現INotifyPropertyChanged,因此UI將更新數據並使用戶可以看到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.