2013-02-14 74 views
0

我是使用RelayCommands的新手(跟随Josh Smith的MVVMDemoApp),可以使用一些帮助来识别我的错误。为什么我的RelayCommand fire和ObservableCollection会捕获选定的值?

我有两个列表框。当第一个项目被选中并且按下“添加”按钮时,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> 

我的视图模型:

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

离开我的添加按钮,永久禁止?我没有做什么让按钮知道一个项目已被选中?这似乎是我对理解命令为什么不会开火的同一条缺失链接。

再次感谢!

回答

0

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

0

您需要根据您的命令提高CanExecuteChanged以让客户知道应该再次检查它是否可以执行。不知道RelayCommand,但我会认为这是沿着mycommand.RaiseCanExecuteChanged(); 行的东西不要忘了先命令你的命令继电器命令,因为你有它暴露为ICommand

+0

尚未发现任何其他代码问题,您是否在调试时检查了输出窗口,以查看是否存在任何绑定问题? – 2013-02-14 01:20:54

相关问题