我正在尝试学习如何使用Silverlight 3 DataForm 控件,因为我需要在XAML代码中自己定义DataForm字段,也就是说,我不想使用AutoGenerateFields属性。
我的问题是:当AutoGenerateFields设置为true时,数据形式工作正常,但是当我创建一个DataForm并手动设置字段并运行应用程序时,我得到的是一个空的空白矩形,其中我的表单及其字段应该是。< / p>
我创建了一个空白的Silverligh导航应用程序来测试它,下面是Home.xaml页面的代码:
<Grid x:Name="LayoutRoot">
<StackPanel>
<!-- This doesn't work. It renders a blank rectangle -->
<dataFormToolkit:DataForm x:Name="DataForm">
<dataFormToolkit:DataForm.EditTemplate>
<DataTemplate>
<StackPanel dataFormToolkit:DataField.IsFieldGroup="True">
<dataFormToolkit:DataField>
<TextBox Text="Test1" />
</dataFormToolkit:DataField>
<dataFormToolkit:DataField>
<TextBox Text="Test2" />
</dataFormToolkit:DataField>
<dataFormToolkit:DataField>
<TextBox Text="Test3" />
</dataFormToolkit:DataField>
</StackPanel>
</DataTemplate>
</dataFormToolkit:DataForm.EditTemplate>
</dataFormToolkit:DataForm>
<!-- This works. -->
<dataFormToolkit:DataForm x:Name="DataForm2"/>
</StackPanel>
</Grid>
<Grid x:Name="LayoutRoot">
<StackPanel>
<!-- This doesn't work. It renders a blank rectangle -->
<dataFormToolkit:DataForm x:Name="DataForm">
<dataFormToolkit:DataForm.EditTemplate>
<DataTemplate>
<StackPanel dataFormToolkit:DataField.IsFieldGroup="True">
<dataFormToolkit:DataField>
<TextBox Text="Test1" />
</dataFormToolkit:DataField>
<dataFormToolkit:DataField>
<TextBox Text="Test2" />
</dataFormToolkit:DataField>
<dataFormToolkit:DataField>
<TextBox Text="Test3" />
</dataFormToolkit:DataField>
</StackPanel>
</DataTemplate>
</dataFormToolkit:DataForm.EditTemplate>
</dataFormToolkit:DataForm>
<!-- This works. -->
<dataFormToolkit:DataForm x:Name="DataForm2"/>
</StackPanel>
</Grid>
为了使第二个DataForm工作,我只创建了一个Person类,并将以下内容放在 Home.xaml.cs 中:
有谁知道什么是错的?提前谢谢。
答案 0 :(得分:3)
为了得到一些东西,我必须添加:
DataForm.CurrentItem = client;
代码。
这只显示了三个没有标签的文本框,条目为“Test1”,“Test2”和“Test3”。这是你期待的吗?
Silverlight Toolkit示例页面有一个模板驱动数据表单示例,它的XAML如下所示:
<dataform:DataForm x:Name="dataForm" ItemsSource="{Binding}" HorizontalAlignment="Left" MinWidth="400" MaxWidth="500" Margin="4" Grid.Column="1">
<dataform:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dataform:DataField>
<TextBox Text="{Binding FirstName, Mode=TwoWay}" />
</dataform:DataField>
<dataform:DataField>
<TextBox Text="{Binding Email, Mode=TwoWay}" />
</dataform:DataField>
<dataform:DataField>
<TextBox Text="{Binding Phone, Mode=TwoWay}" />
</dataform:DataField>
<dataform:DataField Label="Calendar">
<controls:Calendar></controls:Calendar>
</dataform:DataField>
</StackPanel>
</DataTemplate>
</dataform:DataForm.EditTemplate>
</dataform:DataForm>
还有一句话:
DataContext = Contact.People;
在后面的代码中。 (就我能解决的问题,班级People
在其他地方定义)
答案 1 :(得分:1)
我还发现,在表单出现之前需要绑定某些东西是非常令人惊讶的。
如果您尝试绑定到单个项目,则需要执行此操作:
CurrentItem="{Binding Customer}"
或 - 如果您在用户控件中,只需
CurrentItem="{Binding}"
然后在父控件中
<my:AddressControl DataContext="{Binding Customer}"/>
以下是完整的数据表:
<dt:DataForm Name="dfAddress" AutoGenerateFields="False" CurrentItem="{Binding}">
<dt:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dt:DataField Label="First Name">
<TextBox Text="{Binding FirstName, Mode=TwoWay}" Style="{StaticResource FieldTextBoxStyle}" HorizontalAlignment="Stretch" IsReadOnly="False" HorizontalContentAlignment="Stretch" />
</dt:DataField>
<dt:DataField Label="Last Name">
<TextBox Text="{Binding LastName, Mode=TwoWay}" Style="{StaticResource FieldTextBoxStyle}" HorizontalContentAlignment="Stretch" />
</dt:DataField>
</StackPanel>
</DataTemplate>
</dt:DataForm.EditTemplate>
</dt:DataForm>
答案 2 :(得分:0)
你可以在xaml中给出CurrentItem =“”。通过这种方式,您不需要将它实际绑定到任何东西,同时,对数据形式的工作看起来是:)