私はまだWPFに非常に慣れておらず、MVVMパターンを把握しようとしています。2 つの日付ピッカーを持つ mainWindow.xaml ファイルがあります。
<DatePicker Padding="5,5,5,5"
Text="{Binding Path=dateOptObj.openDate, Mode=TwoWay}"/>
<TextBlock Padding="5,5,5,5" Text=" to "/>
<DatePicker Padding="5,5,5,5"
Text="{Binding Path=dateOptObj.closeDate, Mode=TwoWay}"/>
プログラムが日付をロードすると、obj はこれらの日付ピッカーに基づく有効なデータを持ち、これら 2 つの日付に一致するグリッドをロードします。
dateOptObj = new mdDateOptions();
これは、そのオブジェクトをロードする実際のクラスです。
private ICollectionView _datOpts;
public ObservableCollection<string> dates { get; private set; }
public ICollectionView datesView
{
get
{
return _datOpts;
}
}
public mdDateOptions()
{
dates = new ObservableCollection<string>();
dates.Add("Rolling Year");
dates.Add("Year to Date");
dates.Add("Last Year");
_datOpts = CollectionViewSource.GetDefaultView(dates);
_datOpts.CurrentChanged += new EventHandler(OnCurrentChanged);
}
public void OnCurrentChanged(object sender, EventArgs e)
{
string currSel = (string)_datOpts.CurrentItem;
DateTime p_date = new DateTime();
p_date = DateTime.Today;
switch (currSel)
{
case "Rolling Year":
openDate = DateTime.Today.AddYears(-1);
closeDate = DateTime.Today;
openDatePrevious = DateTime.Today.AddYears(-2);
closeDatePrevious = DateTime.Today.AddYears(-1);
break;
case "Year to Date":
openDate = new DateTime(DateTime.Today.Year, 1, 1);
closeDate = DateTime.Today;
openDatePrevious = new DateTime(DateTime.Today.AddYears(-1).Year, 1, 1);
closeDatePrevious = DateTime.Today.AddYears(-1);
break;
case "Last Year":
openDate = new DateTime(DateTime.Today.AddYears(-1).Year, 1, 1);
closeDate = new DateTime(DateTime.Today.AddYears(-1).Year, 12, 31);
openDatePrevious = new DateTime(DateTime.Today.AddYears(-2).Year, 1, 1);
closeDatePrevious = new DateTime(DateTime.Today.AddYears(-2).Year, 12, 31);
break;
default:
MessageBox.Show("Unknown Date Option");
break;
}
}
私の問題は、mainWindow.xaml にグリッドをロードするボタンのリストがある mainWindow.xaml に userControl があることです。userControlのボタンを押すと、datepickersに基づいてグリッド内の特定のデータを除外したいのですが、ビューモデルでリレーコマンドが起動すると、上記のdateOptObjがnullになります。誰かが私を正しい方向に向けることができますか? 以下は、UserControl をロードする方法です。
<vm:StatPanel DockPanel.Dock="Right" Loaded="StatPanel_Loaded" />
以下は、MainWindow.xaml のメイン グリッドでフィルター処理するボタンのグリッドを持つ UserControl パネルです。
<DataGridTemplateColumn Header="Security">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Name="Security" Content="{Binding Path=totalSecurities}" Command="{Binding Source={StaticResource viewModel}, Path=filterGridCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource PassThroughConverter}">
<Binding Path="sector"/>
<Binding ElementName="Security" Path="Name"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
これは私のfilterGridCommandです
public RelayCommand filterGridCommand
{
get
{
if (_filterGridCommand == null)
{
_filterGridCommand = new RelayCommand(filterGrid);
}
return _filterGridCommand;
}
}
private void filterGrid(object param)
{
var values = (object[])param;
string sector = (string)values[0];
string type = (string)values[1];
EmployeeObj empObj = (EmployeeObj)_repsView.CurrentItem;
dash.reFillLogNewAccounts(dateOptObj.openDate, dateOptObj.closeDate, empObj.RRNumber,sector,type);
}