2016-03-25 33 views
1

XAMLMvvmlight UpdateSourceTrigger不工作

<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> 

視圖模型

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(); 
    } 
} 

我想要觸發CellEditEnding事件後的複選框被選中或取消選中,但此事件僅觸發時的電池失去了重點。

這是怎麼回事?

對不起,我的英語不好。

回答

0

這是正常行爲導致事件名稱爲CellEditEnding。這意味着在完成單元格編輯後觸發事件。

我建議你綁定Command財產CheckBox。 如果DataGrid放在Window,你應該寫:

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

如果DataGrid放在UserControl,你應該寫:

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

@zhzhwcn隨時問任何問題。如果您覺得我的回覆對您有幫助,那麼您可以將我的回覆標記爲答案。請閱讀此http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

+0

綁定命令複選框不起作用 – zhzhwcn

+0

@zhzhwcn請參閱我的更新回答 – StepUp

1

你可以做一件事在這種情況下,你必須更新代碼像

首先給你的數據網格的名稱,如

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

現在你已經綁定的複選框選中事件,然後將DataGrid的行,以便您可以訪問視圖模型的行的所有值

<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> 

RelayCommand應該像 我假設你已經在列表綁定在你的datagrid所以基於它你的中繼命令應該是

private RelayCommand<BaseProduct> _CheckBoxChecked; 

    public RelayCommand<BaseProduct> CheckBoxChecked 
    { 
     get { return _CheckBoxChecked??(_CheckBoxChecked=new RelayCommand<BaseProduct>(CheckMethod)); } 
     set { _CheckBoxChecked = value; } 
    } 
    void CheckMethod(BaseProduct product) 
    { 
     // you can access product here 
    } 
+0

但是,哪裏我應該把CheckBoxChecked命令嗎? DataGridCheckBoxColumn的默認datacontext是來自datagrid項目源的項目,所以我不能將VM的命令綁定到DataGridCheckBoxColumn的事件。 – zhzhwcn

+0

@zhzhwcn:不,你可以在DataGridCheckBoxColumn中綁定虛擬機的命令,因爲我使用了RelativeSource = {RelativeSource AncestorType = DataGrid}}「CommandParameter =」{Binding ElementName = dg,Path = SelectedItem} –