1

私はまだ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);
    }
4

0 に答える 0