2016-08-13 1 views
1

Ich habe eine WPF-Anwendung in MVVM mit 2 Textfelder, und ich will i2 datatriggers für die Textfelder „NodeBarcode_1“ und „NodeBarcode_2“WPF MVVM Schalter Fokus zwischen zwei Textfelder

erstellt dynamicaly

In WPF setzen konzentrieren

<DataTrigger Binding="{Binding NodeBarcode_1_GetFocusNow}" Value="True"> 
        <Setter Property="FocusManager.FocusedElement" Value ="{Binding ElementName=NodeBarcode_1}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding NodeBarcode_2_GetFocusNow}" Value="True"> 
        <Setter Property="FocusManager.FocusedElement" Value ="{Binding ElementName=NodeBarcode_2}"/> 
       </DataTrigger> 

im Ansichtsmodell erstellt i 2 boolean Variablen:

public const string NodeBarcode_1_GetFocusNowPropertyName = "NodeBarcode_1_GetFocusNow"; 
private bool _NodeBarcode_1_GetFocusNow = false; 
public bool NodeBarcode_1_GetFocusNow 
{ 
    get 
    { 
     return _NodeBarcode_1_GetFocusNow; 
    } 

    set 
    { 
     if (_NodeBarcode_1_GetFocusNow == value) 
     { 
      return; 
     } 

     _NodeBarcode_1_GetFocusNow = value; 
     RaisePropertyChanged(NodeBarcode_1_GetFocusNowPropertyName); 
    } 
} 

public const string NodeBarcode_2_GetFocusNowPropertyName = "NodeBarcode_2_GetFocusNow"; 
private bool _NodeBarcode_2_GetFocusNow = false; 
public bool NodeBarcode_2_GetFocusNow 
{ 
    get 
    { 
     return _NodeBarcode_2_GetFocusNow; 
    } 

    set 
    { 
     if (_NodeBarcode_2_GetFocusNow == value) 
     { 
      return; 
     } 

     _NodeBarcode_2_GetFocusNow = value; 
     RaisePropertyChanged(NodeBarcode_2_GetFocusNowPropertyName); 
    } 
} 

Und ich erstellt 2 methodes die execuut, wenn der Benutzer einen Barcode in das Textfeld betritt

Wenn der Benutzer den ersten Barcode in der Textbox "NodeBarcode_1" scannt, geht der Fokus auf "NodeBarcode_2". Kein Problem. Aber wenn der Benutzer den nächsten Barcode in "NodeBarcode_2" scannt, möchte ich, dass der Fokus zurück zu "NodeBarcode_1" geht. Aber das passiert nicht.

Was kann dieses Problem verursachen?

Antwort

1

Sie haben zurückgesetzt Ihre Staaten, um die Auslöser arbeiten kontinuierlich wie folgt zu erhalten:

private void NodeBarcode_1_Execute(EventArgs e) { 
    try { 
     IProduct NodeObj = ObjectFactory<IProduct>.Create("Node"); 
     NodeObj.Barcode = NodeBarcode_1_txt; 
     NodeObj.Validation(); 
     labelAppObj.AddProduct(NodeObj); 
     NodeBarcode_1_GetFocusNow = false; // <--- Here 
     NodeBarcode_2_GetFocusNow = true; 

    } 
    catch (Exception ex) { 
     MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
     NodeBarcode_1_txt = string.Empty; 
    } 
} 

private void NodeBarcode_2_Execute(EventArgs e) { 
    try { 
     IProduct NodeObj = ObjectFactory<IProduct>.Create("Node"); 
     NodeObj.Barcode = NodeBarcode_2_txt; 
     NodeObj.Validation(); 
     labelAppObj.AddProduct(NodeObj); 
     NodeBarcode_1_GetFocusNow = true; 
     NodeBarcode_2_GetFocusNow = false; // <--- Here 

    } 
    catch (Exception ex) { 
     MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
     NodeBarcode_2_txt = string.Empty; 
    } 
} 

EDIT

ich ein minimales Beispiel gemacht haben. Ich habe den Code nicht wirklich geändert, also muss diese Lösung mit Ihrem Problem funktionieren, wenn Sie nicht alle Fakten benannt haben.

XAML

<StackPanel Grid.Row="1"> 
      <TextBox x:Name="NodeBarcode_1" Background="Green"> 
       <TextBox.Style> 
        <Style TargetType="TextBox"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding NodeBarcode_1_GetFocusNow}" Value="True"> 
           <Setter Property="FocusManager.FocusedElement" Value ="{Binding ElementName=NodeBarcode_1}"/> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding NodeBarcode_2_GetFocusNow}" Value="True"> 
           <Setter Property="FocusManager.FocusedElement" Value ="{Binding ElementName=NodeBarcode_2}"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBox.Style> 
      </TextBox> 
      <TextBox x:Name="NodeBarcode_2" Background="Blue"> 
       <TextBox.Style> 
        <Style TargetType="TextBox"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding NodeBarcode_1_GetFocusNow}" Value="True"> 
           <Setter Property="FocusManager.FocusedElement" Value ="{Binding ElementName=NodeBarcode_1}"/> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding NodeBarcode_2_GetFocusNow}" Value="True"> 
           <Setter Property="FocusManager.FocusedElement" Value ="{Binding ElementName=NodeBarcode_2}"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBox.Style> 
      </TextBox> 
      <Button Content="Simulate first" Click="Button1_OnClick"></Button> 
      <Button Content="Simulate second" Click="Button2_OnClick"></Button> 
     </StackPanel> 

-Code

private void Button1_OnClick(object sender, RoutedEventArgs e) { 
      try { 
       NodeBarcode_1_GetFocusNow = false; // <--- Here 
       NodeBarcode_2_GetFocusNow = true; 

      } 
      catch (Exception ex) { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
     } 
     private void Button2_OnClick(object sender, RoutedEventArgs e) { 
      try { 
       NodeBarcode_1_GetFocusNow = true; 
       NodeBarcode_2_GetFocusNow = false; // <--- Here 

      } 
      catch (Exception ex) { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
     } 

Die 2 Tasten wird nun korrekt den Fokus wechseln. Wenn dies nicht funktioniert, können Sie etwas vergessen.

+0

Ich habe diese Lösung versucht, aber es funktioniert nicht. Der Fokus reicht von "Nodebarcode_1" bis "NodeBarcode_2", aber er geht nicht zurück auf 1 – Softtoon

+0

@Softtoon Antwort aktualisiert mit funktionierendem Beispiel – lokusking