2016-12-28 2 views
0

Ich habe ein Textfeld ACLBox, die ich eine Zeichenfolge bei der Initialisierung der Benutzeroberfläche anzeigen möchte. Nach der Initialisierung blinkt die Zeichenfolge für eine Sekunde und verschwindet dann. Warum?Warum ist mein Textfeld gelöscht Text

Hier ist der XAML-Code für das Textfeld ein:

 <Window x:Class="Funnel.ACL" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Funnel" 
    mc:Ignorable="d" 
    Title="ACL Configuration" Height="300" Width="560" WindowStartupLocation="CenterScreen" 
    Closing="exitACL" 
    Background="LightGray" Name="ACLConfiguration"> 

<Grid> 
    <DockPanel> 
     <Grid x:Name="FunnelGrid" DockPanel.Dock="Top" ShowGridLines="False"> 

      <!--Defining Grid--> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="130"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="30"/> 
       <ColumnDefinition Width="70"/> 
       <ColumnDefinition Width="75"/> 
       <ColumnDefinition Width="75"/> 
       <ColumnDefinition Width="75"/> 

      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Label x:Name="Config" 
        Content="ACL CONFIGURATION" 
        Grid.Row="0" 
        Grid.Column="0" 
        Grid.ColumnSpan="9" 
        HorizontalAlignment="Center" 
        Foreground="Blue" 
        FontWeight="Heavy" 
        FontSize="16"> 
      </Label> 
      <CheckBox x:Name="aclCheckbox" 
         FlowDirection="RightToLeft" 
         Content="ACL ON" 
         Foreground="Blue" 
         FontWeight="Heavy" 
         FontSize="16" 
         Grid.Row="1" 
         Grid.Column="0" 
         Grid.RowSpan="1" 
         Grid.ColumnSpan="5" 
         HorizontalAlignment="Center" 
         Checked="ACL_Check" 
         Unchecked="ACL_Unchecked" 
         /> 

      <Label x:Name="AddIPAddress" Content="Add IP Address" Grid.Row="2" Grid.Column="0" Width="90" Height="30"></Label> 
      <TextBox x:Name="AddIPTextBox1" Grid.Row="2" Grid.Column="1" Width="35" Height="20" TextChanged="AddIPTextBox1_TextChanged"></TextBox> 
      <TextBox x:Name="AddIPTextBox2" Grid.Row="2" Grid.Column="2" Width="35" Height="20" TextChanged="AddIPTextBox2_TextChanged"></TextBox> 
      <TextBox x:Name="AddIPTextBox3" Grid.Row="2" Grid.Column="3" Width="35" Height="20" TextChanged="AddIPTextBox3_TextChanged"></TextBox> 
      <TextBox x:Name="AddIPTextBox4" Grid.Row="2" Grid.Column="4" Width="35" Height="20" TextChanged="AddIPTextBox4_TextChanged"></TextBox> 
      <TextBox x:Name="AddErrorBox" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Right" BorderThickness="0" Background="LightGray" FontSize="10" Text="{Binding AddErrorText}"/> 
      <Button x:Name="AddButton" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Center" Height="25" Width="50" Click="addClick" FontSize="12" FontWeight="ExtraBold" Background="LightSteelBlue" VerticalAlignment="Top">ADD</Button> 

      <Label x:Name="DelIPAddress" Content="Remove IP Address" Grid.Row="4" Grid.Column="0" Width="120" Height="30"></Label> 
      <TextBox x:Name="DeleteIPTextBox1" Grid.Row="4" Grid.Column="1" Width="35" Height="20" TextChanged="DeleteIPTextBox1_TextChanged"></TextBox> 
      <TextBox x:Name="DeleteIPTextBox2" Grid.Row="4" Grid.Column="2" Width="35" Height="20" TextChanged="DeleteIPTextBox2_TextChanged"></TextBox> 
      <TextBox x:Name="DeleteIPTextBox3" Grid.Row="4" Grid.Column="3" Width="35" Height="20" TextChanged="DeleteIPTextBox3_TextChanged"></TextBox> 
      <TextBox x:Name="DeleteIPTextBox4" Grid.Row="4" Grid.Column="4" Width="35" Height="20" TextChanged="DeleteIPTextBox4_TextChanged"></TextBox> 
      <TextBox x:Name="DelErrorBox" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Right" BorderThickness="0" Background="LightGray" FontSize="10" Text="{Binding DelErrorText}"/> 
      <Button x:Name="DeleteButton" Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Center" Height="25" Width="50" Click="deleteClick" FontSize="12" FontWeight="ExtraBold" Background="LightSteelBlue" VerticalAlignment="Top">DELETE</Button> 
      <Button x:Name="DeleteAllButton" Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Center" Height="25" Width="80" Click="deleteAllClick" FontSize="12" FontWeight="ExtraBold" Background="LightSteelBlue" VerticalAlignment="Top">REMOVE ALL</Button> 

      <Label x:Name="ACLBoxLabel" Content="Access Control List" Foreground="Blue" Grid.Row="1" Grid.Column="6" Grid.ColumnSpan="3" HorizontalAlignment="Center"></Label> 

      <TextBox x:Name="ACLBox" 
       ScrollViewer.HorizontalScrollBarVisibility="Auto" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       ScrollViewer.CanContentScroll="True" 
       Grid.Row="2" 
       Grid.Column="6" 
       Grid.RowSpan="4" 
       Grid.ColumnSpan="4" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Center" 
       Width="220" 
       Height="150" 
       FontSize="14" 
       IsReadOnly="True" 
       Text="{Binding ACLBoxText}" 
       TextWrapping="Wrap" 
       TextAlignment="Center" /> 
     </Grid> 
    </DockPanel> 
</Grid> 

Hier ist der C# -Code für die Zeichenfolge:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

namespace Funnel 
{ 
    /// <summary> 
    /// Interaction logic for ACL.xaml 
    /// </summary> 
    public partial class ACL : Window 
    { 
     AclManager _manage = new AclManager(); 
     FileController _controller = new FileController(); 
     string addStr1; 
     string addStr2; 
     string addStr3; 
     string addStr4; 
     bool addError; 
    string delStr1; 
    string delStr2; 
    string delStr3; 
    string delStr4; 
    bool delError; 
    public string aclText; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public ACL() 
    { 
     InitializeComponent(); 

     if(FunnelGlobals.accessControlList) 
     { 
      aclCheckbox.IsChecked = true; 
     } 

     aclText = _manage.getAclList(); 
    } 

    private void exitACL(object sender,System.ComponentModel.CancelEventArgs e) 
    { 
     _controller.writeAclFile(); 
    } 

    private void ACL_Check(object sender, RoutedEventArgs e) 
    { 
     FunnelGlobals.accessControlList = true; 
     aclText = _manage.getAclList(); 
    } 

    private void ACL_Unchecked(object sender, RoutedEventArgs e) 
    { 
     FunnelGlobals.accessControlList = false; 
     aclText = _manage.getAclList(); 
    } 

    private void AddIPTextBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox1.Text = AddIPTextBox1.Text; 
     addStr1 = AddIPTextBox1.Text; 
     if(!_manage.isDigit(addStr1)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
      addError = true; 
     } 
     else 
     { 
      addError = false; 
     } 
     ACLBox.Text = _manage.getAclList(); 
    } 
    private void AddIPTextBox2_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox2.Text = AddIPTextBox2.Text; 
     addStr2 = AddIPTextBox2.Text; 
     if (!_manage.isDigit(addStr2)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
     } 
     aclText = _manage.getAclList(); 
    } 
    private void AddIPTextBox3_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox3.Text = AddIPTextBox3.Text; 
     addStr3 = AddIPTextBox3.Text; 
     if (!_manage.isDigit(addStr3)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
     } 
     aclText = _manage.getAclList(); 
    } 
    private void AddIPTextBox4_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox4.Text = AddIPTextBox4.Text; 
     addStr4 = AddIPTextBox4.Text; 
     if (!_manage.isDigit(addStr4)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
     } 
     aclText = _manage.getAclList(); 
    } 
    private void addClick(object sender, RoutedEventArgs e) 
    { 
     String addStr = addStr1 + "." + addStr2 + "." + addStr3 + "." + addStr4; 
     if(_manage.isLegit(addStr)) 
     { 
      FunnelGlobals.aclIPs.Add(addStr); 
     } 
     if(addError) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Fix Invalid Characters before Adding"; 
     } 
     else 
     { 
      aclText = _manage.getAclList(); 
     } 

    } 

    private void DeleteIPTextBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox1.Text = DeleteIPTextBox1.Text; 
     delStr1 = DeleteIPTextBox1.Text; 
     if (!_manage.isDigit(delStr1)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void DeleteIPTextBox2_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox2.Text = DeleteIPTextBox2.Text; 
     delStr2 = DeleteIPTextBox2.Text; 
     if (!_manage.isDigit(delStr2)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void DeleteIPTextBox3_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox3.Text = DeleteIPTextBox3.Text; 
     delStr3 = DeleteIPTextBox3.Text; 
     if (!_manage.isDigit(delStr3)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void DeleteIPTextBox4_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox4.Text = DeleteIPTextBox4.Text; 
     delStr4 = DeleteIPTextBox4.Text; 
     if (!_manage.isDigit(delStr4)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void deleteClick(object sender, RoutedEventArgs e) 
    { 
     String delStr = delStr1 + "." + delStr2 + "." + delStr3 + "." + delStr4; 
     FunnelGlobals.aclIPs.Remove(delStr); 

     if (delError) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Fix Invalid Characters before Removing"; 
     } 
     else 
     { 
      aclText = _manage.getAclList(); 
     } 
    } 

    private void deleteAllClick(object sender, RoutedEventArgs e) 
    { 
     FunnelGlobals.aclIPs.Clear(); 
     aclText = _manage.getAclList(); 
    } 

    private void ACLBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     ACLBox.Text = _manage.getAclList(); 
    } 
    public string ACLBoxText 
    { 
     get { return aclText; } 
     set { aclText = value; OnNotifyPropertyChanged("ACLBoxText"); } 
    } 

    private void OnNotifyPropertyChanged(string v) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(v)); 
     throw new NotImplementedException(); 
    } 
} 

}

+3

'ACLBoxText' ist null oder leer, oder? Warum haben Sie eine Viewmodel-Eigenschaft * gebunden und ACLBox initialisiert?Text im Loaded-Ereignis? Trete nicht so auf dich. Binden Sie 'ACLBoxText' (was Sie bereits getan haben), und initialisieren Sie' ACLBoxText', um zu initialisieren, was sich in dem Textfeld befindet. Wenn Sie eine Viewmodel-Eigenschaft binden, verwenden Sie einfach die Eigenschaft. Befreien Sie sich von diesem Loaded-Handler. Das ist wahrscheinlich falsch. Probieren Sie es aus und sehen Sie, ob Sie das Problem noch haben. –

+0

Setzen Sie die 'Text' -Eigenschaft nur durch' binding' oder nur durch Code dahinter. Wenn Sie die 'property' im Code zurückstellen, wird die' binding' unterbrochen. – user1994514

+0

Ich möchte, dass der Text aus einer Liste stammt, die der Benutzer aktualisieren kann ... nach Belieben hinzufügen oder löschen. Wenn der Benutzer zur Listenkonfiguration wechselt, möchte ich die Liste im Textfeld anzeigen. Es blinkt für eine Sekunde in das Textfeld und verschwindet dann. Wenn Sie dann hinzufügen, erscheint die Liste und bleibt. Ich mache beides genau so, außer jetzt habe ich Code aus den Kommentaren hinzugefügt. Der Code verschwindet immer noch. Ich sehe nicht, wo im Code es überschrieben werden könnte. Unter Verwendung von Visual Studio habe ich jede Implementierung von ACLBox.Text durchgesehen und es ist immer auf _manage.getAclList() gesetzt; –

Antwort

0

Wie Ed Plunkett bereits erwähnt, sollten Sie Ihre ACLBoxText Unterstützungsvariable, anstatt den Kontrollwert zurückzusetzen.

So etwas wie dies funktioniert:

private void ACLBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    ACLBoxText = _manage.getAclList(); 
} 

Leider ist die Ansicht nicht über Änderungen an Trägereigenschaften nicht wissen, wenn Sie es sagen, dass etwas geändert. Sie müssen INotifyPropertyChanged implementieren:

private string _aclBoxText; 

public string ACLBoxText { 
    get { return _aclBoxText; } 
    set { 
     _aclBoxText = value; 
     OnNotifyPropertyChanged("ACLBoxText"); 
    } 
} 

protected void OnNotifyPropertyChanged(string name) 
{ 
    var handler = PropertyChanged; 

    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(name)); 
} 

public event PropertyChangedEventHandler PropertyChanged; 
+0

So etwas funktioniert, wenn OP die Ansicht in ein gefälschtes Viewmodel verwandelt * und * setzt 'this.DataContext = this;', obwohl es keine gute Möglichkeit ist, Dinge zu tun. Aber ich denke, Sie müssen herausfinden, was (wenn überhaupt) 'ACLBoxText' eigentlich zuerst ist. Wenn es ein Viewmodel gibt, sollte OP es nicht einfach wegwerfen und von vorne beginnen. –

+0

Ich habe die Benachrichtigung hinzugefügt und das gleiche passiert. –

0

Nach der Initialisierung die Zeichenfolge blinkt für eine Sekunde, dann verschwindet. Warum?

Wahrscheinlich, weil Sie „Überschreiben“, um den Wert der ACLBoxText Quelleigenschaft sind, die zunächst im Textblock angezeigt wird, wenn Sie die Eigenschaft Text des Textblocks in Ihrem Loaded Event-Handler gesetzt.

Wenn der TextBlock nach dem Laden der UI leer ist, sollten Sie sicherstellen, dass die Methode _manage.getAclList() die Zeichenfolge zurückgibt, von der Sie erwarten, dass sie zurückgegeben wird. Sie könnten vorübergehend versuchen die Eigenschaft Text auf einem „statischen“ Wert zuzuweisen:

private void ACLBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    ACLBox.Text = "TEXT"; 
} 

Aber ich stimme zu, dass es nicht viel Sinn macht, zuerst die Text-Eigenschaft des Textblock mit einer Quelle Eigenschaft in der XAML zu binden Markup und behandeln Sie dann das Loaded-Ereignis desselben TextBlocks und legen Sie seine Text-Eigenschaft in diesem Ereignishandler auf einen neuen Wert fest. Aber ich denke, Sie haben Ihre Gründe ...

Beachten Sie, dass die Bindung, die Sie im XAML-Markup definieren, zurückgesetzt wird, wenn Sie die Text-Eigenschaft in Ihrem Loaded-Handler jedoch programmgesteuert festlegen.

Sie sollten also nicht die Text-Eigenschaft im XAML-Markup binden, oder das Loaded-Ereignis nicht behandeln und die Text-Eigenschaft programmgesteuert festlegen. Es ist das eine oder das andere, aber nicht beides.

+0

Wenn ich einen statischen String-Wert hatte, dann erscheint und verschwindet er auch. Ich sehe keinen Code, der den Wert überschreiben würde. –

+0

Was ist mit dem Code in Ihrem Loaded-Event? Dies überschreibt den Anfangswert. – mm8

+0

Das geladene Ereignis hat denselben Wert wie der Anfangswert. Ohne das geladene Ereignis wird nichts in der Box angezeigt, bis Sie eine andere IP-Adresse hinzufügen. Dann erscheint die gesamte Liste und die neue IP in der Textbox. –

0

Ich habe das Problem herausgefunden. Dies ist mein erstes C# -Projekt und das erste Mal, dass ich Xaml (wpf) benutze, sodass ich die Bindung falsch verstanden habe. Ich habe den Text wie in der ersten Zeile gebunden. Der Text wird nie innerhalb dieser GUI ausgelöst, so dass ich den Text nur wegen geladenem Text sehen konnte, aber dann setzte die Textbindung die Textbox auf Null zurück. Wenn ich meinen Text änderte, um nicht gebunden zu sein, dann funktioniert alles so, wie ich es wollte. Lektion gelernt. Die Bindung wird nur benötigt, wenn Sie aus CS-Dateien auf ein Textfeld zugreifen. Es wird nicht in xaml.cs benötigt. Da mein Text nur von xaml.cs ausgelöst wird, genügt es, Text auf die übliche Weise zu setzen (zB textbox.text = "was auch immer"), was ich brauche. Vielen Dank für Ihre Hilfe. Ich verstehe viel mehr, viel besser jetzt. Java macht die Dinge anders. :)