Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将动态创建的WPF窗口序列化为XAML失败_C#_.net_Wpf_Xaml_Datagrid - Fatal编程技术网

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

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属

我正在与VS 2013、WPF和C#一起为WPF面具设计一个动态面具。 因为我不熟悉这些东西,所以我编写了一个小的WPF应用程序来做一些实验。 在这些实验中,我遇到了以下问题:

  • 当DataGrid之类的控件绑定到数据源时,Canvas面板到XAML的序列化失败

  • 即使序列化工作正常,我也看不到XAML中的绑定

  • 在我的应用程序中,我得到了一个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的行进行注释。 接下来,我将创建两个文本框,它们将绑定到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)