2016-02-19 10 views
6

前に、私はtelerik RadGridViewWPFアプリケーションでを使用しています。ユーザがcommandをイベントとして焼成されている列の値を変更し、ポップが示されている場合、列の一つは、以下の機能、無効にグリッドイベント火災WPF

を有しています。ポップアップ結果(YesまたはNo)を使用して、collectionを更新しています。

今私はここでの問題に直面しています。

問題:

ユーザーがrowの一つにそのcolumnの値を変更していると警告が表示される前に、彼は同じcolumnの別のrowに変化しています。したがって、アプリケーションは異なる方法で動作し、機能は崩壊します。試してみました

仕事:

私は、イベントが発生したら、グリッドをdisableと機能が完了した後に使用可能にしてみました。しかし、ユーザーはイベントtriggersが値を変更する前でも非常に高速です。

はXAML:

<telerik:GridViewDataColumn Name="grdItemBuildColumn" DataMemberBinding="{Binding Build, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnlyBinding="{Binding IsEnable, Mode=OneWay, UpdateSourceTrigger= PropertyChanged}"> 
<telerik:GridViewDataColumn.CellEditTemplate>              <DataTemplate> 
<telerik:RadMaskedNumericInput Value="{Binding Build, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Mask="#1.0" Placeholder=" " 
TextMode="PlainText" AllowInvalidValues="False" IsClearButtonVisible="False" AutoFillNumberGroupSeparators="False"ext:MaskedInputExtensions.Minimum="0" SelectionOnFocus="SelectAll" AcceptsReturn="False"> 
<i:Interaction.Triggers>                 <i:EventTrigger EventName="ValueChanged"> 
<i:InvokeCommandAction Command="{Binding BuidValueChangedCommand, Source={StaticResource MarketSeriesViewModel}}" /> 
</i:EventTrigger> 
</i:Interaction.Triggers> 
</telerik:RadMaskedNumericInput> 
</DataTemplate> 
</telerik:GridViewDataColumn.CellEditTemplate> 
</telerik:GridViewDataColumn> 

コマンド:

public ICommand BuidValueChangedCommand { get { return new RelayCommand(BuildValueChanged); } } 

のViewModel:

private void BuildValueChanged() 
    { 
    // Ask confirmation for delete. 
    if (ShowMessages.MessageBox("This will be removed from the collection", "Application")) 
     { 
     DeleteItem(SelectedItem.Id) 
     } 
    else 
     { 
     Item bo = RestoreBuild(SelectedItem); 
     SelectedItem = bo; 
     } 
    } 

は、私はちょうど再ようなものが必要ユーザがイベントtriggersまで2番目の値を変更しないようにし、彼はポップアップから何か(Yes/No)を選択します。

誰かがこれで私を助けることができますか?

+0

ViewModelでIsGridEnabledプロパティを作成し、コマンドセットIsGridEnabled = falseの最後にコマンドセットIsGridEnabled = falseの最後にプロパティを作成することをお勧めします。もちろん、あなたのグリッドをバインドしてください。このプロパティに有効にしてください –

+0

@ВасилийШапенко:試してみましたが、イベント(コマンド)が発生する前でも値を変更しようとしました。 – iamCR

+0

あなたのviewModelはINotifyPropertyChangedを使用していますか? – ProgrammingDude

答えて

3

次を試してください。

XAML

<Grid> 
    <telerik:RadBusyIndicator IsBusy="{Binding ImBusy, UpdateSourceTrigger=PropertyChanged}"> 
     <telerik:RadGridView Margin="2" 
         ItemsSource="{Binding ChannelRuleMappings}" 
         SelectionUnit="FullRow" 
         SelectionMode="Extended" AutoGenerateColumns="False" 
         IsFilteringAllowed="False"> 
      <telerik:RadGridView.Columns> 

       <telerik:GridViewDataColumn Name="grdItemBuildColumn" DataMemberBinding="{Binding Build, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnlyBinding="{Binding IsEnable, Mode=OneWay, UpdateSourceTrigger= PropertyChanged}"> 
        <telerik:GridViewDataColumn.CellEditTemplate> 
         <DataTemplate> 
          <telerik:RadMaskedNumericInput Value="{Binding Build, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Mask="#1.0" Placeholder="*" 
                 TextMode="PlainText" 
                  UpdateValueEvent="LostFocus" 
                  AllowInvalidValues="False" IsClearButtonVisible="False" AutoFillNumberGroupSeparators="False" 
                 maskedInput:MaskedInputExtensions.Minimum="0" SelectionOnFocus="SelectAll" AcceptsReturn="False"> 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="ValueChanged"> 
             <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
             AncestorType={x:Type telerik:RadGridView}}, Path=DataContext.BuidValueChangedCommand}"/> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </telerik:RadMaskedNumericInput> 
         </DataTemplate> 
        </telerik:GridViewDataColumn.CellEditTemplate> 
       </telerik:GridViewDataColumn> 

      </telerik:RadGridView.Columns> 
     </telerik:RadGridView> 
    </telerik:RadBusyIndicator> 
</Grid> 

VMやモデル

//GridView VM - screen is a simple implementation of the INPC 
public class StackOptimizerChannelRulesViewModel : Screen 
{ 
    //provides values for grid view items source collection 
    private readonly IStackOptimizerStep _step; 
    //IUserInteractionService is a simple implementation of the massage box service 
    private readonly IUserInteractionService _interactionService; 
    private bool _imBusy; 

    public StackOptimizerChannelRulesViewModel(IStackOptimizerStep step, IUserInteractionService interactionService) 
    { 
     _step = step; 
     _interactionService = interactionService; 
     DisplayName = "Channels Rules"; 
     ChannelRuleMappings = new ObservableCollection<ChannelRuleMappingModelBase>(); 
    } 

    protected override void OnInitialize() 
    { 
     base.OnInitialize(); 
     Init(); 
    } 

    public ObservableCollection<ChannelRuleMappingModelBase> ChannelRuleMappings { get; set; } 

    //allows to show the vbusy indicator 
    public bool ImBusy 
    { 
     get { return _imBusy; } 
     set 
     { 
      _imBusy = value; 
      NotifyOfPropertyChange(()=>ImBusy); 
     } 
    } 

    private ICommand _cmd; 
    public ICommand BuidValueChangedCommand 
    { 
     get { return _cmd ?? (_cmd = new ActionCommand(BuildValueChanged)); } 
    } 

    private void BuildValueChanged() 
    { 
     ImBusy = true; 
     // Ask confirmation for delete. 
     if (_interactionService.AskYesNo("This will be removed from the collection")) 
     { 
      //Add yor logic on yes 
      ImBusy = false; 
     } 
     else 
     { 
      //Add yor logic on no 
      ImBusy = false; 
     } 
    } 

    private void Init() 
    { 
     var channelRuleMappings = _step.GetRulesForChannels(); 
     if (channelRuleMappings != null) 
      channelRuleMappings.ForEach(parameter => ChannelRuleMappings.Add(new ChannelRuleMappingModel(parameter, _interactionService))); 
    } 
} 

//Row VM base 
public class ChannelRuleMappingModelBase : PropertyChangedBase 
{ 
    private string _name; 
    private readonly IUserInteractionService _interactionService; 
    private StackOptimizerSelectionRules _stackOptimizerSelectedRule; 
    private object _build; 

    public ChannelRuleMappingModelBase(string channelName, IUserInteractionService interactionService) 
    { 
     _name = channelName; 
     _interactionService = interactionService; 
    } 

    public virtual string Name 
    { 
     get { return _name; } 
    } 

    public virtual StackOptimizerSelectionRules StackOptimizerSelectedRule 
    { 
     get { return _stackOptimizerSelectedRule; } 
     set 
     { 
      _stackOptimizerSelectedRule = value; 
      NotifyOfPropertyChange(() => StackOptimizerSelectedRule); 
     } 
    } 

    public object Build 
    { 
     get { return _build; } 
     set 
     { 
      _build = value; 
      NotifyOfPropertyChange(() => Build); 
     } 
    } 
} 

//Row VM 
public class ChannelRuleMappingModel : ChannelRuleMappingModelBase 
{ 
    private StackOptimizerSelectionRules _stackOptimizerSelectedRule; 
    private ISpectrumRuleParameter _ruleMapping; 

    public ChannelRuleMappingModel(ISpectrumRuleParameter ruleMapping, IUserInteractionService interactionService): 
     base(ruleMapping.PolarizationKey.Name, interactionService) 
    { 
     _ruleMapping = ruleMapping; 
     _stackOptimizerSelectedRule = _ruleMapping.Rule; 

    } 

    public override StackOptimizerSelectionRules StackOptimizerSelectedRule 
    { 
     get { return _stackOptimizerSelectedRule; } 
     set 
     { 
      _stackOptimizerSelectedRule = value; 
      NotifyOfPropertyChange(() => StackOptimizerSelectedRule); 
      UpdateOriginalRuleMapping(StackOptimizerSelectedRule); 
     } 
    } 

    private void UpdateOriginalRuleMapping(StackOptimizerSelectionRules stackOptimizerSelectedRule) 
    { 
     if(_ruleMapping == null) return; 
     _ruleMapping.Rule = stackOptimizerSelectedRule; 
    } 
} 

中小説明:

  1. ビジーインジケータが追加されました(telerikのRadBusyIndi​​cator)。
  2. コマンドは、行の親(RadGridView)ビューモデル内で定義されました。
  3. 相対的結合はRadGridViewのビューモデル内のコマンドを指すために使用されます。
  4. UpdateValueEvent = "LostFocus"、 "ValueChanged"イベントが発生したため、RadMaskedNumericInputの値を変更してフォーカスを他の場所に移動する(タブが押されたか、マウスが他のコントロールに移動した)コマンドを起動すると、このコマンドはBusyIndi​​catorを表示し、BusyIndi​​catorはグリッドビュー(RadGridView)をロックします。
  5. 、それがどのように見えるか

here is the picture

すると、コードにもっと説明が必要なら、私に教えてください。

よろしくお願いいたします。

+0

まだまれに、警告が表示される前に次の行の値を編集することができます。 – iamCR

+0

@SanthoshKumarあなたはUpdateValueEvent = "LostFocus"を使うべきです。このプロパティを使用しましたか? – Ilan

+0

イベントを追加するときに、ユーザーが2番目の値を変更しようとしたときにのみ警告がスローされます。ユーザーが1つの値のみを変更した場合、アラートはスローされません。あなたは私を得ることができますか?ユーザーが値を変更したときにアラートをスローする必要があります。 – iamCR