C# 将动态创建的WPF窗口序列化为XAML失败
我正在与VS 2013、WPF和C#一起为WPF面具设计一个动态面具。 因为我不熟悉这些东西,所以我编写了一个小的WPF应用程序来做一些实验。 在这些实验中,我遇到了以下问题:C# 将动态创建的WPF窗口序列化为XAML失败,c#,.net,wpf,xaml,datagrid,C#,.net,Wpf,Xaml,Datagrid,我正在与VS 2013、WPF和C#一起为WPF面具设计一个动态面具。 因为我不熟悉这些东西,所以我编写了一个小的WPF应用程序来做一些实验。 在这些实验中,我遇到了以下问题: 当DataGrid之类的控件绑定到数据源时,Canvas面板到XAML的序列化失败 即使序列化工作正常,我也看不到XAML中的绑定 在我的应用程序中,我得到了一个ViewModel类,在其中我创建了一个包含两列(“vorname”和“nachname”)和四行的DataTable。 此外,我还得到了一个DataView属
private void CreateDatagrid()
{
DataGrid datagrid = new DataGrid();
datagrid.Name = "datagrid";
datagrid.SetValue(Canvas.LeftProperty, 20.0);
datagrid.SetValue(Canvas.TopProperty, 10.0);
datagrid.SetValue(DataGrid.AutoGenerateColumnsProperty, true);
//datagrid.ItemsSource = DataSource;
_canvasPanel.Children.Add(datagrid);
}
正如您所看到的,此时将在其中设置DataGrid的ItemsSource的行进行注释。
接下来,我将创建两个文本框,它们将绑定到DataGrid中实际选定的行和该行中的一个特殊列
private void CreateTextboxes()
{
CreateTextbox("vorname", "datagrid", "SelectedItem.vorname", 220, 10);
CreateTextbox("nachname", "datagrid", "SelectedItem.nachname", 220, 40);
}
private void CreateTextbox(string name, string elementName, string path, double leftPos, double topPos)
{
TextBox tb = new TextBox();
tb.SetValue(Canvas.LeftProperty, leftPos);
tb.SetValue(Canvas.TopProperty, topPos);
tb.Width = 150;
tb.Name = name;
Binding tbbinding = new Binding();
tbbinding.ElementName = elementName;
tb.SetBinding(TextBox.TextProperty, tbbinding);
_canvasPanel.Children.Add(tb);
}
正如您所看到的,文本框“vorname”和“nachname”被创建并绑定到DataGrid列中它们的名称。
然后我想将父控件(包括它的子控件)序列化为xaml文件。
在这种情况下,我按下一个按钮,该按钮执行以下操作:
public void SerializeToXaml(FrameworkElement parentControl)
{
FileStream fs = File.Open("MyXamlFile.xaml", FileMode.Create);
XamlWriter.Save(parentControl, fs);
fs.Close();
}
没有将ItemsSource绑定到DataView,它就可以工作。
在这一点上,我只是有点不安,绑定似乎没有在XAML文件中序列化。
如有任何建议,将不胜感激
<Canvas Background="#FFF0F8FF" Name="designerpanel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataGrid AutoGenerateColumns="True" Name="datagrid" Canvas.Left="20" Canvas.Top="10">
<DataGrid.ItemBindingGroup>
<BindingGroup Name="{x:Null}" NotifyOnValidationError="False" ValidatesOnNotifyDataError="True" SharesProposedValues="True" />
</DataGrid.ItemBindingGroup>
</DataGrid>
<TextBox Name="vorname" Width="150" Canvas.Left="220" Canvas.Top="10" xml:space="preserve" />
<TextBox Name="nachname" Width="150" Canvas.Left="220" Canvas.Top="40" xml:space="preserve" />
</Canvas>
任何帮助都将不胜感激。
再见,
Patrick您是否有一种属于内部的类型?这似乎就是问题所在。您只能序列化公共类型我在SocialMSDN上找到一篇文章,文章中说DataGrid的NewItemPlaceHolder是非公共对象,无法序列化。当我将属性CanUserAddRows设置为false时,序列化工作。但这有点奇怪,我在序列化创建的XAML文件中看不到绑定信息。您有内部类型吗?这似乎就是问题所在。您只能序列化公共类型我在SocialMSDN上找到一篇文章,文章中说DataGrid的NewItemPlaceHolder是非公共对象,无法序列化。当我将属性CanUserAddRows设置为false时,序列化工作。但这有点奇怪,我在序列化创建的XAML文件中看不到绑定信息。
System.InvalidOperationException wurde nicht behandelt.
HResult=-2146233079
Message=The not public type "MS.Internal.NamedObject" cannot be serialized.
Source=PresentationFramework
StackTrace:
at System.Windows.Markup.Primitives.MarkupWriter.VerifyTypeIsSerializable(Type type)