簡體   English   中英

選擇組合框后c#MVVM更新Datagrid

[英]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屬性,以便當您從下拉列表更改日期時,它還將更新DataGridItemsSource

在SelectedDate的設置器中,調用獲取網格值的代碼。 您還應該實現INotifyPropertyChanged,因此UI將更新數據並使用戶可以看到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM