2016-07-20 7 views
0

いくつかのテキスト列を持つデータグリッドがあり、すべてのテキスト列のデフォルト値は1です。また、 'save'という名前のボタンを使用して、データグリッドの列。 私の要件は、データグリッドのテキスト列の値が変更された場合にのみ、[保存]ボタンを有効にする必要があります。助けてください。以下はデータグリッドのテキスト列の値が変更されたときに保存ボタンを有効にする

は私のコードです: -

View:- 
x:Name="datagrid_range_targets" local:SetMinWidthToAutoAttachedBehaviour.SetMinWidthToAuto="true" 
        ItemsSource="{Binding RangeData, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" 
        Margin="0,5,5,0" Loaded="OnUserControlLoaded" Unloaded="OnUserControlUnloaded" Style="{StaticResource style_data_grid}"> 
      <DataGrid.Resources> 
       <Style x:Key="errorStyle" TargetType="{x:Type TextBox}"> 
        <Setter Property="Padding" Value="-2"/> 
        <Style.Triggers> 
         <Trigger Property="Validation.HasError" Value="True"> 
          <Setter Property="Background" Value="Red"/> 
          <Setter Property="ToolTip" 
          Value="{Binding RelativeSource={RelativeSource Self}, 
          Path=(Validation.Errors)[0].ErrorContent}"/> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.Resources> 

      <DataGrid.Columns> 
       <DataGridTextColumn x:Name="col_range_targets_range" 
            Width="Auto" 
            Binding="{Binding Name}" 
            Header="Range" IsReadOnly="True" /> 

       <DataGridTextColumn x:Name="col_budget_report_year1" 
            Width="Auto" 
            Header="Year 01" EditingElementStyle="{StaticResource errorStyle}"> 
        <DataGridTextColumn.Binding> 
         <Binding Path="budgetReportYear1" Mode="TwoWay" 
           > 
          <Binding.ValidationRules> 
           <local:GreaterThanOrEqualLessThanOrEqual Max="99" 
                     Min=".0000001" /> 
          </Binding.ValidationRules> 
         </Binding> 
        </DataGridTextColumn.Binding> 
       </DataGridTextColumn> 
       <DataGridTextColumn x:Name="col_budget_report_year2" 
            Width="Auto" 
            Header="Year 02" EditingElementStyle="{StaticResource errorStyle}"> 
        <DataGridTextColumn.Binding> 
         <Binding Path="budgetReportYear2" Mode="TwoWay" 
           UpdateSourceTrigger="Default"> 
          <Binding.ValidationRules> 
           <local:GreaterThanOrEqualLessThanOrEqual Max="99" 
                     Min="0.0000001" /> 
          </Binding.ValidationRules> 
         </Binding> 
        </DataGridTextColumn.Binding> 
       </DataGridTextColumn> 

<Button x:Name="Save" Click="btn_Set_mulutiplier_Click" Content="Set multiplier" 
               Style="{StaticResource button_SetMultiplier}" /> 




       View Model- 
        private double _budgetReportYear1 = 1; 
    private double _budgetReportYear2 = 1; public double budgetReportYear1 
    { 
     get { return _budgetReportYear1; } 
     set 
     { 
      _budgetReportYear1 = value; 
      Onchanged("budgetReportYear1"); 
     } 
    } 


    public double budgetReportYear2 
    { 
     get { return _budgetReportYear2; } 
     set 
     { 
      _budgetReportYear2 = value; 
      Onchanged("budgetReportYear2"); 
     } 
    } 

答えて

0

は、あなたのViewModelにプロパティを追加します。

private bool _columnModified = false; 
public bool columnModified{ 
    get { return _columnModified; } 
    set 
    { 
     _columnModified = value; 
    } 
} 

は、あなたのbudgetReportsセッターにこれを追加します。

columnModified = true; 

そして、あなたのビューセットにボタンIsEnabledプロパティはcolumnModifiedにバインドしています:

<Button Content="Save" IsEnabled="{Binding columnModified}"/> 

また、保存が完了すると、columnModifiedをfalseに戻す必要があります。テキストボックス内の各時間は、ユーザーがプロパティの変更今

<Binding Path="budgetReportYear1" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 

に結合

+0

ご返信ありがとうございます。私は同じアプローチを使用しましたが、保存ボタンはまだ有効な状態になっています。私の場合は、上記のように、私は使用してプライベートプロパティでdatagridtext列のデフォルト値を1に設定しています。私はそれが働いていない理由だと思う。 – Ram

+0

このソリューションは私のシナリオでは機能しません。デフォルトでは、IsEnabled = "{Binding columnModified}"を使用した後でも[保存]ボタンが有効になります。 – Ram

0

変更。設定者の中で、ボタンをtrueにします。つまり、

BOOLプロパティのsaveボタンをBoolプロパティにバインドしてtrueに設定します。 保存ボタンをクリックすると、プロパティもfalseに設定され、ボタンの状態がリセットされます。

+0

この解決方法は機能しません。保存ボタンは有効なまま表示されます。 – Ram

+0

@Ram:それはそれを動作させる方法に関する単なるアイデアです。プロパティセッターに達した場合や何かがブロックされている場合は、ブレークポイントを入れてテキスト列を編集している間にチェックしてください。必要に応じて、テストに必要なコード全体を共有することができます。完全なソリューションを使用して、デバッグして手助けします。 – ViVi

+0

こんにちは、ありがとうございました。 DataGridの同じコードで、私は元に戻すとやり直しの機能をしたい。ユーザーが保存ボタンをクリックせずに閉じるボタンを押すと、挿入された値はすべてデータグリッドに保存されません。 – Ram

関連する問題