2015-09-24 3 views
1

мой флажок отмечен, событие полностью не запускается вообще. вот мой код datagrid. Как я должен запустить Проверенное событие в wpf mvvm.checkbox in datagrid checked event not trigger wpf mvvm

<Window x:Class="EmployeeManager.View.DataGridDownload" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
     xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
     Title="DataGridDownload" Height="600" Width="790"> 
    <Grid> 
     <DataGrid HorizontalAlignment="Left" ItemsSource="{Binding TransView}" AutoGenerateColumns="False" Margin="10,62,0,0" VerticalAlignment="Top" Height="497" Width="762"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="caseRefNo" Binding="{Binding caseRefNo}" /> 
       <DataGridTextColumn Header="subjMatr" Binding="{Binding subjMatr}" /> 
       <DataGridTextColumn Header="Download %" Binding="{Binding incValue}" /> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox 
           Content="Please Select" IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="Checked"> 
             <i:InvokeCommandAction Command="{Binding CheckCommand}" /> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </CheckBox> 
         </DataTemplate>       
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding incValue,UpdateSourceTrigger=PropertyChanged}" Background="Red" Foreground="White" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
     <Label Content="{Binding UpdatePercentage}" HorizontalAlignment="Left" Background="Blue" Foreground="White" Margin="10,10,0,0" VerticalAlignment="Top" Width="338" Height="30"> 
     </Label> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="672,20,0,0" VerticalAlignment="Top" Width="75"/> 

    </Grid> 
</Window> 

Вот мой взгляд модель

public class DataGridDownloadViewModel:BindableBase{ 
public ObservableCollection<tblTransaction> TransList 
{ get; private set; } 
public DispatcherTimer dispatchTimer = new DispatcherTimer(); 
public CollectionView TransView 
{ get; private set; } 

public DelegateCommand<object> CheckCommand { get; set; } 

private String _UpdatePer; 
public String UpdatePercentage 
     { 
      get { return _UpdatePer; } 
      set { SetProperty(ref _UpdatePer, value); } 
     } 

private string _caseId; 
public string CaseID 
     { 
      get { return _caseId; } 
      set { SetProperty(ref _caseId, value); } 
     } 

private string _isChecked; 
public string isChecked 
     { 
      get { return _isChecked; } 
      set { SetProperty(ref _isChecked, value); } 
     } 

private bool CanExecute(object args) 
     { 
      return true; 
     } 

private void CheckBoxChecker(object args) 
     { 
      //Should Work Here 
      // Totally not coming to this function 
     }  

public DataGridDownloadViewModel(List<tblTransaction> model) 
     { 
      CheckCommand = new DelegateCommand<object>(CheckBoxChecker, CanExecute); 

      dispatchTimer.Interval = TimeSpan.FromMilliseconds(3000); 
      dispatchTimer.Tick += dispatchTimer_Tick; 
      BackGroundThread bgT = Application.Current.Resources["BackGroundThread"] as BackGroundThread; 

      bgT.GetPercentChanged += (ss, ee) => 
      { 
       UpdatePercentage = bgT.local_percentage.ToString();    
      }; 

      bgT.GetCaseID += (ss, ee) => 
      { 
       CaseID = bgT.local_caseRef; 
      }; 

      TransList =new ObservableCollection<tblTransaction>(model); 
      TransView = GetTransCollectionView(TransList); 
      TransView.Filter = OnFilterTrans; 

      var tokenSource = new CancellationTokenSource(); 
      var token = tokenSource.Token; 

      var cancellationTokenSource = new CancellationTokenSource(); 

      dispatchTimer.Start(); 

     } 

private void dispatchTimer_Tick(object sender, EventArgs e) 
     { 
      UpdateDataGrid(); 
     }  

public void UpdateDataGrid() 
     {   
       foreach (tblTransaction tran in TransList) 
       { 
        if (tran.caseRefNo == CaseID) 
        { 
         tran.incValue = int.Parse(UpdatePercentage); 

        } 
        else 
        { 
         tran.incValue = tran.incValue;      
        } 
       } 

       TransView.Refresh();   
     } 

bool OnFilterTrans(object item) 
     { 
      var trans = (tblTransaction)item; 
      return true;   
     } 

     public CollectionView GetTransCollectionView(ObservableCollection<tblTransaction> tranList) 
     { 
      return (CollectionView)CollectionViewSource.GetDefaultView(tranList); 
     } 
    } 

ли это правильный способ сделать это? почему checkcommand не является триггером?

Отредактировано

вот моя модель:

public class tblTransaction 
{ 
    public string caseRefNo { get;set;} 
    public string subjMatr { get; set; } 
    public int incValue { get; set; } 
    public DateTime? longTime { get; set; } 

    public bool IsSelected { get; set; } 
} 

Благодаря

+0

Где ваш 'IsSelected' недвижимость в ViewModel? – Jose

+0

он приходит форма привязка модели. я обновлю свой код –

ответ

2

Попробуйте следующее:

<i:InvokeCommandAction Command="{Binding DataContext.CheckCommand, 
    RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" /> 
+0

Да, он работает. первый раз в порядке, но во второй раз он будет срабатывать, поэтому может потребоваться время одним щелчком мыши. Это из-за DispatcherTimer или AncestorType? –

+0

'AncestorType' просто сообщает источнику родственников, в каком типе предка-контроля он должен остановиться, чтобы искать. – Tomtom

+0

ANcestorType i изменяется на DataGrid. Это не проблема DispatcherTimer. –

Смежные вопросы