我正在使用VS 2013,WPF和C#在动态掩码设计器上进行WPF掩码。 因为我不熟悉这些东西,所以我编写了一个小型WPF应用程序来进行一些实验。 虽然这些实验我遇到了以下问题:
当像DataGrid这样的控件绑定到数据源时,Canvas Panel到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的行进行注释。 接下来我创建了两个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)
任何帮助将不胜感激。 再见, 帕特里克