2016-03-25 10 views
1

XAMLMvvmlight Update nicht funktioniert

<DataGrid ItemsSource="{Binding Products}" CanUserAddRows="False" AutoGenerateColumns="False" SelectedItem="{Binding SelectedProduct}"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="CellEditEnding"> 
     <cmd:EventToCommand Command="{Binding ProdcutCellEditCmd,UpdateSourceTrigger=PropertyChanged}" PassEventArgsToCommand="True"></cmd:EventToCommand> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
<DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding id}" Header="ID" IsReadOnly="True"></DataGridTextColumn> 
    <DataGridTextColumn Binding="{Binding ParentLCSKU}" Header="LCSKU(Parent)" IsReadOnly="True"></DataGridTextColumn> 
    <DataGridTextColumn Binding="{Binding ChildLCSKU}" Header="LCSKU(Child)" IsReadOnly="True"></DataGridTextColumn> 
    <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource ProductColors}}" SelectedValueBinding="{Binding Color}" Header="颜色" IsReadOnly="True"></DataGridComboBoxColumn> 
    <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource ProductSizes}}" SelectedValueBinding="{Binding Size}" Header="尺寸" IsReadOnly="True"></DataGridComboBoxColumn> 
    <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource ProductCategories}}" SelectedValueBinding="{Binding Category}" Header="类别" IsReadOnly="True"></DataGridComboBoxColumn> 
    <DataGridTextColumn Binding="{Binding Cost}" Header="成本"></DataGridTextColumn> 
    <DataGridCheckBoxColumn Binding="{Binding IsOEM,UpdateSourceTrigger=PropertyChanged}" Header="OEM"></DataGridCheckBoxColumn> 
</DataGrid.Columns> 

Viewmodel

public ProductVM() 
{ 
    ProdcutCellEditCmd = new RelayCommand<DataGridCellEditEndingEventArgs>(prodcutDataGridCellEditEnding); 

} 
public RelayCommand<DataGridCellEditEndingEventArgs> ProdcutCellEditCmd { get; set; } 
private void prodcutDataGridCellEditEnding(DataGridCellEditEndingEventArgs e) 
{ 
    if (e.EditAction == DataGridEditAction.Commit) 
    { 
     var prodcut = e.Row.DataContext as BaseProduct; 
     SelectedProduct = prodcut; 
     productSave(); 
    } 
} 

Ich möchte das CellEditEnding Ereignis auszulösen, nachdem das Kontrollkästchen aktiviert oder deaktiviert werden, aber dieses Ereignis nur ausgelöst wird, wenn die Zelle verlorener Fokus.

Was ist falsch daran?

Sorry für mein schlechtes Englisch.

Antwort

0

Es ist normales Verhalten Ursache Ereignisname ist CellEditEnding. Dies bedeutet, dass das Ereignis nach dem Ende der Zellenbearbeitung ausgelöst wird.

Ich empfehle Ihnen, an Command Eigenschaft in CheckBox zu binden. Wenn Sie DataGrid in Window platziert, sollten Sie schreiben:

<CheckBox Header="OEM" IsChecked="{Binding IsOEM,UpdateSourceTrigger=PropertyChanged}}" 
       Command="{Binding DataContext.ProdcutCellEditCmd, RelativeSource= 
       {RelativeSource AncestorType=Window, Mode=FindAncestor}}"}" /> 

Wenn Sie DataGrid in UserControl platziert, sollten Sie schreiben:

<CheckBox Header="OEM" IsChecked="{Binding IsOEM,UpdateSourceTrigger=PropertyChanged}}" 
       Command="{Binding DataContext.ProdcutCellEditCmd, RelativeSource= 
       {RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"}" /> 
+0

@zhzhwcn zögern, eine Frage zu stellen. Wenn Sie meinen, dass meine Antwort Ihnen hilft, können Sie meine Antwort als Antwort markieren. Bitte lesen Sie diese http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

+0

Binding-Befehl an das Kontrollkästchen funktioniert nicht – zhzhwcn

+0

@zhzhwcn bitte, siehe meine aktualisierte Antwort – StepUp

1

Sie eine Sache in diesem Fall tun können Sie Code aktualisieren müssen wie

zuerst den Namen Ihrer Datenraster geben wie

<DataGrid ItemsSource="{Binding Products}" Name="dg" CanUserAddRows="False" AutoGenerateColumns="False" SelectedItem="{Binding SelectedProduct}"> 

Nun müssen Sie das Kontrollkästchen aktiviert Ereignis binden und die Reihe von Datagrid übergeben, so dass Sie alle Werte, die Zeilen in Ansichtsmodell zugreifen können

<DataGridCheckBoxColumn Binding="{Binding IsOEM,UpdateSourceTrigger=PropertyChanged}" Header="OEM"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Checked"> 
          <i:InvokeCommandAction Command="{Binding CheckBoxChecked,Mode=TwoWay,RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding ElementName=dg,Path=SelectedItem}" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </DataGridCheckBoxColumn> 

Ihre RelayCommand sollte wie sein Ich gehe davon aus, dass Sie die Liste binden, in Ihrem Datagrid so basierend darauf sollte Ihr Relais-Befehl

+0

Aber wo sollte ich den CheckBoxChecked-Befehl setzen? Der Standarddatacontext der DataGridCheckBoxColumn ist das Element aus der DataGridCheck-Elementquelle. Daher kann ich den VM-Befehl nicht an das Ereignis der DataGridCheckBoxColumn binden. – zhzhwcn

+0

@zhzhwcn: nein, Sie können den VM-Befehl in DataGridCheckBoxColumn binden, für den ich RelativeSource verwendet = {RelativeSource AncestorType = DataGrid}} "CommandParameter =" {Binding ElementName = dg, Pfad = SelectedItem} –