将动态创建的WPF窗口序列化为XAML失败

时间:2016-03-29 10:40:11

标签: c# .net wpf xaml datagrid

我正在使用VS 2013,WPF和C#在动态掩码设计器上进行WPF掩码。 因为我不熟悉这些东西,所以我编写了一个小型WPF应用程序来进行一些实验。 虽然这些实验我遇到了以下问题:

  1. 当像DataGrid这样的控件绑定到数据源时,Canvas Panel到XAML的序列化失败。

  2. 即使序列化有效,我也无法在XAML中看到绑定。

  3. 在我的应用程序中,我得到了一个ViewModel类,其中我创建了一个包含两列(“vorname”和“nachname”)和四行的DataTable。 此外,我有一个DataView属性,它返回DataTable的DefaultView属性。 首先,我在代码隐藏中创建一个DataGrid:

    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的行进行注释。 接下来我创建了两个TextBox,它们将绑定到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>
    

    但是当我将ItemsSource属性绑定到DataView时它失败了 - 正如您在错误消息中看到的那样。

    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)
    

    任何帮助将不胜感激。 再见, 帕特里克

0 个答案:

没有答案