为什么我的RelayCommand fire和ObservableCollection不会捕获选定的值?

时间:2013-02-14 00:53:47

标签: c# wpf mvvm observablecollection relaycommand

我是使用RelayCommands的新手(遵循Josh Smith的MVVMDemoApp),可以使用一些帮助来识别我的错误。

我有两个列表框。选择第一个项目并按下“添加”按钮时,将执行AddCommand,第二个列表的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>

我的ViewModel:

 //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;
    }

永久禁用我的添加按钮?我不做什么让按钮知道项目已被选中?这似乎与我理解为什么命令没有一直触发相同的缺失链接。

再次感谢!

2 个答案:

答案 0 :(得分:0)

您需要在命令中引发CanExecuteChanged以让客户端知道它应该再次检查以查看它是否可以执行。不确定RelayCommand,但我认为这是mycommand.RaiseCanExecuteChanged();的内容 不要忘记首先将命令转发到relay命令,因为它已将其公开为ICommand

答案 1 :(得分:0)

OOPS!在经过一个小时的挣扎之后发布这个之后,我意识到在我的视图中我指的是selectedItem属性“SelectedPartNumber”而不是“SelectedPN”。这解决了这两个问题。已经评估了CanExecuteChanged。