警告:我是来自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。
答案 0 :(得分:1)
虽然可以从代码中创建控件,但您应该不再考虑Windows窗体创建UI的方式,并详细了解WPF如何在general和data 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。