0

RelayCommands (Josh Smith の MVVMDemoApp に従って) を使用するのは初めてで、間違いを特定するのに役立つ可能性があります。

私は2つのリストボックスを持っています。最初のリストのアイテムが選択され、[追加] ボタンが押されると、AddCommand が実行され、2 番目のリストの ObservableCollection が selectedItem を追加されます。

私の見解:

<DockPanel >

    <Border DockPanel.Dock="Bottom" Height="50" HorizontalAlignment="Left" Width="150" >
        <!--Notice here that the Button was disabled until it was given a DataContext, which allowed the CanAddPN to be true-->
        <Button Command="{Binding Path=AddToPartsBinCommand}" Content="Add >" />
    </Border>

    <UniformGrid Columns="2" Rows="1" DockPanel.Dock="Top" >
        <!--ListBox 1 (PartNumbersCollection)-->
        <ListBox Background="PaleGoldenrod"
                 ItemsSource="{Binding PnsCollection, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                 SelectedItem="{Binding SelectedPartNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding pn}">

                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <!--ListBox 2 (SelectedPartNumbersCollection)-->
        <ListBox ItemsSource="{Binding PartsBinCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding pn}">

                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </UniformGrid>


</DockPanel>

私のビューモデル:

 //DummyDBEntities _context;
    public ObservableCollection<PartNumber> _pnsCollection;
    public ObservableCollection<PartNumber> _partsBinCollection;

    PartNumber _selectedPN;
    public ICommand _addToPartsBinCommand;



    public MasterViewModel(DummyDBEntities _context)
    {
        _context = new DummyDBEntities();
        this._pnsCollection = new ObservableCollection<PartNumber>(_context.PartNumbers);
        this._partsBinCollection = new ObservableCollection<PartNumber>();



    }




    public ObservableCollection<PartNumber> PnsCollection
    {
        get { return this._pnsCollection; }
        set
        {
            _pnsCollection = value;
            OnPropertyChanged("PnsCollection");
        }
    }

    public PartNumber SelectedPN
    {
        get { return this._selectedPN; }
        set 
        {
            this._selectedPN = value;
            OnPropertyChanged("SelectedPN");
            OnPropertyChanged("PartsBinCollection");
        }

    }

    public ObservableCollection<PartNumber> PartsBinCollection
    {
        get
        {
            if (_partsBinCollection == null)
            {
                _partsBinCollection = new ObservableCollection<PartNumber>();
            }
            return this._partsBinCollection;
        }
        set 
        {
           this._partsBinCollection = value;
            OnPropertyChanged("PartsBinCollection");
        }
    }


    public ICommand AddToPartsBinCommand
    {
        get
        {
            if (_addToPartsBinCommand == null)
                _addToPartsBinCommand = new RelayCommand(() => this.AddPN(),
                                                         () => this.CanAddPN());
            return this._addToPartsBinCommand;
        } 
    }

    private bool CanAddPN()
    {
        return true;
    }


    private void AddPN()
    {
        if (this._partsBinCollection == null)
        {
            this._partsBinCollection = new ObservableCollection<PartNumber>();
        }

        this._partsBinCollection.Add(this._selectedPN);

    }

前もって感謝します!

また:なぜでしょう:

   private bool CanAddPN()
    {
        return this._selectedPN != null;
    }

[追加] ボタンを永久に無効のままにしますか? アイテムが選択されたことをボタンに知らせるために何をしていませんか? これは、コマンドが起動しない理由についての私の理解への同じミッシングリンクのようです。

再度、感謝します!

4

2 に答える 2

0

CanExecuteChangedコマンドを実行して、実行できるかどうかを再度確認する必要があることをクライアントに知らせる必要があります。についてはわかりませんRelayCommandが、次のようなものだとmycommand.RaiseCanExecuteChanged(); 思います。コマンドをリレーコマンドにキャストすることを忘れないでくださいICommand

于 2013-02-14T01:13:08.240 に答える
0

おっとっと!これを投稿した直後、1 時間の苦労の末、自分のビューで「SelectedPN」ではなく、selectedItem プロパティ「SelectedPartNumber」を参照していることに気付きました。これにより、両方の問題が解決されました。CanExecuteChanged は既に評価されています。

于 2013-02-14T01:19:39.203 に答える