2016-02-19 10 views
6

Ich verwende Telerik RadGridView in meiner WPF Anwendung. Eine der Spalten hat die folgende Funktionalität:Deaktivieren Sie das Gitter vor dem Ereignis Feuer WPF

Wenn der Benutzer den Wert der Spalte ändert, wird ein command als Ereignis ausgelöst und ein Pop wird angezeigt. Mit dem Popup-Ergebnis (Ja oder Nein) aktualisiere ich die collection.

Jetzt habe ich hier ein Problem.

Ausgabe:

Der Benutzer wird den Wert dieses column in einem der row Wechsel und vor der Alarm erscheint er in einem anderen row derselben column verändert. Die Anwendung funktioniert also anders und die Funktionalität bricht zusammen.

Arbeit versucht:

Ich habe versucht, das Netz einmal das Ereignis ausgelöst disable und aktivieren, nachdem die Funktion abgeschlossen ist. Aber trotzdem ist der Benutzer sehr schnell, noch bevor das Ereignis triggers er den Wert ändert.

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> 

Befehl:

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

Ansichtsmodell:

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

Ich brauche nur etwas wie Wieder strikte den Benutzer nicht den zweiten Wert bis zum Ereignis triggers zu ändern und er wählt etwas (Ja/Nein) aus dem Popup.

Kann mir jemand dabei helfen?

+0

Ich empfehle Ihnen, eine Eigenschaft IsGridEnabled in Ihrem ViewModel zu erstellen, und am Anfang des Befehlssatzes IsGridEnabled = false, am Ende des Befehlssatzes IsGridEnabled = false. Und natürlich binden Sie Ihre grid.IsEnabled an diese Eigenschaft –

+0

@ ВасилийШапенко: Versucht, dass aber der Benutzer den Wert ändert, noch bevor das Ereignis (Befehl) ausgelöst wird. – iamCR

+0

Verwendet Ihr ViewModel INotifyPropertyChanged? – ProgrammingDude

Antwort

3

bitte versuchen Sie es das nächste:

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

//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; 
    } 
} 

Kleine Erklärung:

  1. Ein Busy-Indikator wurde hinzugefügt (Teleriks RadBusyIndicator).
  2. Der Befehl wurde im übergeordneten ViewModel der Zeile (RadGridView) definiert.
  3. Eine relative Bindung wird verwendet, um auf den Befehl im ViewModel von RadGridView zu zeigen.
  4. Jedes Mal, wenn Benutzer den Wert von RadMaskedNumericInput ändern und den Fokus an die andere Stelle verschieben (Registerkarte wurde gedrückt oder die Maus war zu einem anderen Steuerelement) aufgrund UpdateValueEvent = "LostFocus" das Ereignis "ValueChanged" ausgelöst wird der Auslöser Starten Sie den Befehl, dieser Befehl bewirkt, dass der BusyIndicator angezeigt wird, der BusyIndicator wird die Grid-Ansicht (RadGridView) sperren.

Wie es aussieht: here is the picture

Lassen Sie mich wissen, wenn Sie mehr Erklärung auf den Code benötigen.

Grüße.

+0

Aber immer noch zu einem seltenen Zeitpunkt kann ich den nächsten Zeilenwert bearbeiten, bevor die Warnung erscheint. – iamCR

+0

@SanthoshKumar sollten Sie das UpdateValueEvent = "LostFocus" verwenden. Hast du diese Eigenschaft benutzt? – Ilan

+0

Beim Hinzufügen des Ereignisses wird die Warnung nur ausgelöst, wenn der Benutzer versucht, den zweiten Wert zu ändern. Wenn der Benutzer nur einen Wert ändert, wird die Warnung nicht ausgelöst. Kannst du mich holen? Ich möchte, wenn der Benutzer den Wert ändert, den der Alarm ausgelöst werden soll. – iamCR

Verwandte Themen