2016-06-20 13 views
0

Ich habe eine Liste, die Elemente aus einer beobachtbaren Sammlung ComputerlistWie MVVM I Command auf Schaltfläche verwenden?

<ListView x:Name="icTodoList" ItemsSource="{Binding ComputerList}" SelectedItem="{Binding SelectedComputer}" Grid.Column="3" SelectionChanged="icTodoList_SelectionChanged_1"> 

        <ListView.ItemTemplate> 
         <DataTemplate> 
          <Border BorderBrush="{Binding borderColor }" BorderThickness="2" Margin="0,0,0,1"> 
           <Grid Margin="2" Height="auto" Width="auto"> 
<Button Height="18" Command="{Binding RemoveComputer}" HorizontalAlignment="Right" ToolTipService.ShowDuration="60000" Margin="0,1,38,0" x:Name="button1_Copy" VerticalAlignment="Top" Width="25" FontSize="11" Foreground="#FF6BADF6" Content="" BorderBrush="#FF6BADF6" Grid.Column="8"/> 
           </Grid>         
          </Border> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 

meine Schaltfläche klicken laden sollte die Elemente aus ObservableCollection entfernen, so habe ich ICommand-Schnittstelle auf diese Weise (in Kurzform) bauen.

class ComputerViewModel : ViewModelBase 
    { 
     CustomClass _customClass = new CustomClass(); 
     public readonly ObservableCollection<Model.Model.ControleData> _ComputerList = new ObservableCollection<Model.Model.ControleData>(); 
     public ObservableCollection<Model.Model.ControleData> ComputerList { get { return _ComputerList; } } 
     public ComputerViewModel() 
     { 
      ComputerList.Add(new Model.Model.ControleData { ComputerName = "TESTMACHINE", titlePing = "online",borderColor = Genkai.BlueMain }); 
     // TextBoxText = "init"; 
      _canExecute = true; 



     } 
    private ICommand _RemoveComputer; 
     public ICommand RemoveComputer 
     { 
      get 
      { 
       return _RemoveComputer ?? (_RemoveComputer = new CommandHandler(() => RemoveComp(), _canExecute)); 
      } 
     } 
    private bool _canExecute; 

    public void RemoveComp() 
     { 
      Debug.WriteLine("close Item"); 

     } 
    public class CommandHandler : ICommand 
     { 
      private Action _action; 
      private bool _canExecute; 
      public CommandHandler(Action action, bool canExecute) 
      { 
       _action = action; 
       _canExecute = canExecute; 
      } 
      public void Execute(object parameter) 
      { 
       _action(); 
      } 

      public bool CanExecute(object parameter) 
      { 
       return _canExecute; 
      } 

      public event EventHandler CanExecuteChanged; 


     } 
} 

Die Aktion removecomp wird nicht ausgelöst, wenn ich klicke. seine

aber mit diesem meiner Meinung nach Modell gefeuert

var hwc = new CommandHandler(RemoveComp,true); 

      if (hwc.CanExecute(this)) 

       hwc.Execute(this); 

also denke ich, dass ich etwas in meiner WPF Ansicht verpassen.

+0

ja scheinen gleiche Problem zu binden, aber bekam Schmerzen versucht verstehen und immer noch nicht feuern – Zwan

+1

Ich würde nicht empfehlen "CanExecute" als Boolean, sondern als 'Func ' zu übergeben, sonst kann man den Wert nicht einfach ändern später. Ihre Befehlsklasse muss auch eine Methode bereitstellen, die aufgerufen werden kann, um 'CanExecuteChanged' auszulösen, das ausgelöst werden muss, wenn sich die' CanExecute'-Funktion im Rückgabewert ändern kann. –

Antwort

0

Sie versuchen, VM-Befehle in datatemplate zu binden. Es kann diesen Befehl nicht finden, weil er einen anderen Kontext hat. versuchen auf diese Weise

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:TypeOfYourControlOrWindow}}, Path=DataContext.YourCommand}" 
+0

Ich bin in einem UserControl ComputerView, wenn es ausprobiert: Command = "{Binding RelativeSource = {RelativeSourceAncestorType = {x: Type Controls: ComputerView}} funktioniert nicht – Zwan

+0

für Informationen ein anderes Cmd Arbeit außerhalb der Listview wenn es hilft – Zwan

+0

haben Sie den Befehl am Ende Command = vergessen "{Bindende RelativeSource = {RelativeSource AncestorType = {x: Steuerelemente: ComputerView}}, Path = DataContext.RemoveComputer}" – tym32167