为什么我的文本框加载文本消失了

时间:2016-12-28 16:31:40

标签: c# wpf data-binding

我有一个文本框ACLBox,我想在初始化用户界面时显示一个字符串。初始化后,字符串闪烁一秒钟然后消失。为什么呢?

这里是文本框的xaml代码:

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

这是字符串的C#代码:

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 个答案:

答案 0 :(得分:0)

正如Ed Plunkett已经提到的那样,你应该使用你的ACLBoxText支持变量而不是重置控制值。

这样的事情会起作用:

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

不幸的是,视图不知道对支持属性的更改,除非您告诉它更改了某些内容。您需要实施INotifyPropertyChanged

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;

答案 1 :(得分:0)

  

初始化后,字符串闪烁一秒钟然后消失。为什么呢?

可能是因为你正在&#34;覆盖&#34;当您在Loaded事件处理程序中设置TextBlock的Text属性时,ACLBoxText源属性的值,该属性最初显示在TextBlock中。

如果在加载UI后TextBlock为空,则应确保_manage.getAclList()方法返回您希望返回的字符串。您可以暂时尝试将Text属性分配给&#34; static&#34;值:

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

但我同意,首先将TextBlock的Text属性绑定到XAML标记中的source属性,然后处理同一TextBlock的Loaded事件并将其Text属性设置为a,这没有多大意义。此事件处理程序中的新值。但我猜你有理由......

请注意,当您在Loaded处理程序中以编程方式设置Text属性时,将在XAML标记中定义的绑定将被重置。

因此,您应该在XAML标记中绑定Text属性,或者不处理Loaded事件并以编程方式设置Text属性。它是一个或另一个,但不是两个。

答案 2 :(得分:0)

我弄明白了这个问题。这是我的第一个C#项目,并且第一次使用Xaml(wpf),所以我误解了绑定。我像在初级gui中那样绑定文本。文本永远不会在这个gui中触发,所以我只能看到文本因为加载而闪存,但文本绑定将文本框重置为空。当我将文本更改为不受约束时,一切都按照我的意愿运行。学过的知识。只有从.cs文件中访问文本框时才需要绑定。在xaml.cs中不需要它。因为我的文本只会被xaml.cs触发,所以只需按常规方式设置文本(即textbox.text =&#34;无论什么&#34;)就能满足我的需要。感谢大家的帮助。我现在理解绑定得多,好多了。 Java以不同的方式做事。 :)