Textbox.Text未在WPF

时间:2015-04-22 13:41:10

标签: c# wpf xaml textbox

警告:我是来自Windows表单背景的完整WPF菜鸟。

我有一个WPF UserControl,后者又包含其他几个UserControl,每个UserControl都意味着显示来自用户文件的某些数据块。其中一个控件只显示名称,地址和客户ID。

所以,我的主控制看起来像这样:

<UserControl x:Class="Plus.Gui.FileView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="800" d:DesignWidth="1200" 
             xmlns:gui="clr-namespace:Plus.Gui">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="150*" />
            <RowDefinition Height="150*" />
            <RowDefinition Height="200*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="488*" />
            <ColumnDefinition Width="260*" />
            <ColumnDefinition Width="252*" />
        </Grid.ColumnDefinitions>
        <gui:pnlDebtor Grid.Column="2" HorizontalAlignment="Stretch" x:Name="pDebtor" VerticalAlignment="Stretch" />
    </Grid>
</UserControl>

pnlDebtor控件应显示我的信息。

我的主控件的代码隐藏如下:

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.Navigation;
using System.Windows.Shapes;
using MyDataLayer;

namespace Plus.Gui
{
    public partial class FileView : UserControl
    {
        public FileView()
        {
            InitializeComponent();
        }

        public FileView(MyCase file)
        {
            InitializeComponent();
            pDebtor = new pnlDebtor(file);
        }
    }
}

我用一个从文件加载数据的新pnlDebtor替换我的默认pnlDebtor。

这是我的pnlDebtor控件的xaml和代码隐藏的一部分。

<UserControl x:Class="Plus.Gui.pnlDebtor"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="230" d:DesignWidth="460">
    <Grid>
        <GroupBox Header="Debtor" HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="groupBox1" VerticalAlignment="Stretch">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="28" />
                    <RowDefinition Height="56" />
                    <RowDefinition Height="28" />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="80*" />
                    <ColumnDefinition Width="380*" />
                </Grid.ColumnDefinitions>
                <Label Content="Name:" Height="28" HorizontalAlignment="Left" Name="lblName" VerticalAlignment="Top" />
                <Label Content="Address:" Grid.Row="1" Height="28" HorizontalAlignment="Left" Name="lblAddress" VerticalAlignment="Top" />
                <Label Content="Customer Nr.:" Grid.Row="2" Height="28" HorizontalAlignment="Left" Name="lblCustomerNr" VerticalAlignment="Top" />
                <TextBox Grid.Column="1" Height="23" HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="tbName" VerticalAlignment="Top" IsEnabled="False" IsReadOnly="False" />
                <TextBox Grid.Column="1" Grid.Row="1" Height="46" HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="tbAddress" VerticalAlignment="Top" IsReadOnly="False" IsEnabled="True" />
                <TextBox Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="tbCustomerNr" VerticalAlignment="Top" IsEnabled="True" IsReadOnly="False" />
                <Button Content="Debtor Details" Grid.ColumnSpan="2" Grid.Row="3" Height="23" HorizontalAlignment="Left" Margin="0,0,0,0" Name="btnDetails" VerticalAlignment="Top" />
            </Grid>
        </GroupBox>
    </Grid>
</UserControl>

public pnlDebtor(MyCase file)
{
    InitializeComponent();
    Contact con = AbstractDataObject.GetObject4ID<Contact>(file.DebtorID);
    string strName = con.Name1;

    if (con.Name2 != null)
        strName += " " + con.Name2;

    if (con.Name3 != null)
        strName += " " + con.Name3;

    if (con.FirstName != null)
        strName += ", " + con.FirstName;

    tbName.Text = strName;
    tbAddress.Text = "test address";
    tbCustomerNr.Text = "test customer id";
}

所以,基本上,我传入文件并使用文件中的信息更新文本框。简单。只是,它没有用。

如果我在创建新的pnlDebtor后设置断点,并检查属性,则确实已更改tbName.Text,tbAddress.Text和tbCustomerNr.Text。但是所有的盒子在gui中都是空的。

如果不是分配新的pnlDebtor,我只是在FileView控件的代码隐藏中更改值(pDebtor.tbName.Text =&#34; Dummy&#34;),它可以正常工作。

我在这里缺少什么?我不能用这种方式用新的控件替换现有控件吗?

我在设置新控件之前尝试将原始pnlDebtor设置为null,但结果相同。不知怎的,我的控件正被替换,但从未被发送到GUI。

2 个答案:

答案 0 :(得分:1)

虽然可以从代码中创建控件,但您应该不再考虑Windows窗体创建UI的方式,并详细了解WPF如何在generaldata binding中工作}。

基本上,您需要将文本框值绑定到字符串属性,然后仅使用代码来设置这些属性的值,绑定将负责其余部分并为您更新UI。

答案 1 :(得分:0)

看起来您想要使用数据绑定。您可以在xaml中指定绑定的数据上下文,或者使其与您在后面的代码中可以执行的现有代码类似:

DataContext = AbstractDatenObjekt.GetObjekt4ID<Contact>(file.DebtorID);

XAML:

<TextBox Text="{Binding strName, Mode=TwoWay}" Grid.Column="1" Height="23" HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="tbName" VerticalAlignment="Top" IsEnabled="False" IsReadOnly="False" />

在您的联系人类中,您需要实现INotifyPropertyChanged或使用像https://stackoverflow.com/a/1316417/2622972这样的基本案例。完成之后,为strName添加一个属性,该属性调用您的版本,但是您执行INotifyPropertyChanged。