2016-03-25 7 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> 

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

私は、チェックボックスがオンまたはオフされた後CellEditEndingイベントをトリガしたいが、このイベントが唯一の火をするとき、セルフォーカスを失った。

何が問題ですか?

私の悪い英語を申し訳ありません。

答えて

0

正常な動作の原因イベント名はCellEditEndingです。これは、セル編集の終了後にイベントが発生することを意味します。

CommandプロパティをCheckBoxにバインドすることをお勧めします。 あなたDataGridWindowに配置された場合は、あなたが書く必要があります:

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

あなたDataGridUserControlに配置された場合は、あなたが書く必要があります:

<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}"> 
0のようなあなたのデータグリッドの名前を与えます

は、今あなたがのViewModelにその行のすべての値にアクセスできるようにチェックボックスにチェックイベントを結合して、データグリッドの行を渡す必要が

<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は、私はあなたがリストをバインドしていることを前提としてい ようにする必要がありますあなたのデータグリッドでそれに基づいてあなたのリレーコマンドは

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:いいえ、私はRelativeSource = {RelativeSource AncestorType = DataGrid}} "CommandParameter =" {バインディングElementName = dg、Path = SelectedItem}を使用しているため、DataGridCheckBoxColumnでVMのコマンドをバインドすることはできません。 –

関連する問題