首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF -在XAML中引用XAML元素

WPF -在XAML中引用XAML元素
EN

Stack Overflow用户
提问于 2013-04-16 22:30:37
回答 2查看 631关注 0票数 2

我搜索了整个互联网,每个论坛,每个博客,任何地方。我现在从字面上包含了互联网...除了最后一件事;-)。这就是问题所在:我有一个WPF DataGrid,它有一个定义如下的列:

代码语言:javascript
复制
 <tk:DataGridTemplateColumn Header="First name" Width="100" x:Name="colFirstName">
                        <tk:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox x:Name="tbFirstName" Validation.ErrorTemplate="{DynamicResource errorTemplateYourDetailsGrid}">
                                    <TextBox.Text>
                                        <Binding Path="Firstname" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                                            <Binding.ValidationRules>
                                                <val:RequiredValidationRule ErrorMessage="Invalid or missing first name" ValidatesOnTargetUpdated="True"></val:RequiredValidationRule>
                                            </Binding.ValidationRules>
                                        </Binding>
                                    </TextBox.Text>
                                </TextBox>
                            </DataTemplate>
                        </tk:DataGridTemplateColumn.CellTemplate>
                    </tk:DataGridTemplateColumn>

如您所见,我定义了一个名为errorTemplateYourDetailsGrid的验证模板。

该页面有一个我想禁用的continue按钮,直到此网格中的所有字段都有效:

代码语言:javascript
复制
 <Button x:Name="btnNext"  HorizontalAlignment="Right" DockPanel.Dock="Right" Content="Continue" Command="{Binding YourDetailsNextCommand}" >
                    <Button.Style>
                        <Style TargetType="Button"  BasedOn="{StaticResource BtnContinue}">
                            <Setter Property="IsEnabled" Value="false" />
                            <Style.Triggers>
                                <MultiDataTrigger>
                                    <MultiDataTrigger.Conditions>
                                        <Condition Binding="{Binding ElementName=tbFirstName, Path=(Validation.HasError)}" Value="false" />
                                        <Condition Binding="{Binding ElementName=tbSurname, Path=(Validation.HasError)}"    Value="false" />
                                      ...etc 
                                    </MultiDataTrigger.Conditions>
                                    <Setter Property="IsEnabled" Value="true" />
                                </MultiDataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                </Button>

我的一位同事使用基于表单的直接布局(而不是使用数据网格)很好地完成了这类工作。所以我猜我需要一些语法来引用DataGrid列的单元格中的TextBox,以便触发触发器。简单地使用ElementName是行不通的。当您在这些字段中输入文本时,即使验证模板按预期消失,该按钮仍保持禁用状态。

我使用的是MVVM,所以不能选择任何基于代码隐藏的解决方案。

EN

回答 2

Stack Overflow用户

发布于 2013-05-05 15:15:06

执行验证的方法是使用INotifyDataErrorInfo (如果使用XAML4.0或更低版本,则使用IDataErrorInfo ),因此不会在.NET中定义验证逻辑,而是在模型和视图模型类中定义验证逻辑。

一旦实现了它,您就有了一个查询错误的中心位置,并且可以将按钮的触发器绑定到视图模型的INotifyDataErrorInfo.HasErrors属性。

票数 0
EN

Stack Overflow用户

发布于 2013-05-05 15:24:05

请查看这些文章,看看它们是否可以帮助您找到数据模板元素:

How to: Find DataTemplate-Generated Elements

C#/WPF: Get Binding Path of an Element in a DataTemplate

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16039790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档