c# – ContentControl中的GroupBox – 支持由绑定到ContentControl的内容实现的IDataErrorInfo

c# – ContentControl中的GroupBox – 支持由绑定到ContentControl的内容实现的IDataErrorInfo,第1张

概述我有一个ViewModel,它代表多个选项并实现IDataErrorInfo.此ViewModel仅在选择了至少其中一个选项时才有效.它绑定到ContentControl. DataTemplate用于将ViewModel可视化为包含ItemsControl的GroupBox.另一个DataTemplate将每个选项可视化为CheckBox. 我需要做什么,使ContentControl与IDat 我有一个viewmodel,它代表多个选项并实现IDataErrorInfo.此viewmodel仅在选择了至少其中一个选项时才有效.它绑定到ContentControl. DataTemplate用于将viewmodel可视化为包含ItemsControl的GroupBox.另一个DataTemplate将每个选项可视化为CheckBox.

我需要做什么,使ContentControl与IDataErrorInfo一起工作,并在选中或取消选中复选框时检查有效性?

一些代码:

捆绑:

<ContentControl Content="{Binding GeneralinvoiceTypes,ValIDatesOnDataErrors=True}"                margin="0,5,0" />

数据模板:

<DataTemplate DataType="{x:Type viewmodels:MultipleOptionsviewmodel}">  <GroupBox header="{Binding Title}">    <ItemsControl ItemsSource="{Binding Options}" />  </GroupBox></DataTemplate><DataTemplate DataType="{x:Type viewmodels:Optionviewmodel}">  <CheckBox IsChecked="{Binding IsChecked}"            Content="{Binding name}"            margin="6,3,0" /></DataTemplate>

样式:

<Style targettype="{x:Type ContentControl}">  <Style.Triggers>    <Trigger Property="ValIDation.HasError"             Value="true">      <Setter Property="tooltip"              Value="{Binding relativeSource={x:Static relativeSource.Self},Path=(ValIDation.Errors)[0].ErrorContent}" />    </Trigger>  </Style.Triggers>  <Setter Property="ValIDation.ErrorTemplate">    <Setter.Value>      <ControlTemplate>        <GrID>          <GrID.ColumnDeFinitions>            <ColumnDeFinition WIDth="90*" />            <ColumnDeFinition WIDth="20" />          </GrID.ColumnDeFinitions>          <border borderBrush="Red"                  borderThickness="1"                  CornerRadius="2.75"                  GrID.Column="0">            <AdornedElementPlaceholder GrID.Column="0" />          </border>          <TextBlock Foreground="Red"                     GrID.Column="1"                     margin="0"                     FontSize="12"                     VerticalAlignment="Center"                     HorizontalAlignment="left"                     x:name="txtError">            *          </TextBlock>        </GrID>      </ControlTemplate>    </Setter.Value>  </Setter></Style>
解决方法

What do I have to do,to make the ContentControl work together with
IDataErrorInfo and check the valIDity when a check Box is checked or
unchecked?

添加一点Rachels回答.

使用异步数据验证更容易解决此问题,但遗憾的是,这在WPF 4.5 is released之前不可用.

内容绑定到Mainviewmodel中的GeneralinvoiceTypes.由于我们不能进行异步数据验证,因此必须为GeneralinvoiceTypes引发PropertyChanged以进行验证.这可行,但我会采用Rachel建议的方法,并在MultipleOptionsviewmodel中引入另一个名为IsValID的属性

可以从Tag(或附加属性)到GeneralinvoiceTypes.IsValID完成对IsValID的绑定.当在任何选项中更改IsChecked时,我们还必须在MultipleOptionsviewmodel中得到通知.例如,可以通过在CheckBoxes中使用命令绑定来完成此 *** 作.

因此,需要沿着以下几行进行一些更改.

我还上传了一个示例项目,在此实现:https://www.dropbox.com/s/fn8e4n4s68wj3vk/ContentControlValidationTest.zip?dl=0

ContentControl中

<ContentControl Content="{Binding Path=GeneralinvoiceTypes}"                Tag="{Binding Path=GeneralinvoiceTypes.IsValID,ValIDatesOnDataErrors=True}" />

Optionviewmodel DataTemplate

<DataTemplate DataType="{x:Type viewmodels:Optionviewmodel}">    <CheckBox IsChecked="{Binding IsChecked}"                Content="{Binding name}"                Command="{Binding relativeSource={relativeSource AncestorType={x:Type ContentControl}},Path=DataContext.IsValIDCheckCommand}"                margin="6,0" /></DataTemplate>

MultipleOptionsviewmodel

private ICommand m_isValIDCheckCommand;public ICommand IsValIDCheckCommand{    get    {        return m_isValIDCheckCommand ??            (m_isValIDCheckCommand = new RelayCommand(param => IsValIDCheck()));    }}private voID IsValIDCheck(){    IsValID = CheckIsValID();}private bool CheckIsValID(){    foreach (Optionviewmodel option in Options)    {        if (option.IsChecked == true)        {            return true;        }    }    return false;}private bool m_isValID;public bool IsValID{    get { return m_isValID; }    set    {        m_isValID = value;        OnPropertyChanged("IsValID");    }}public string this[string columnname]{    get    {        if (columnname == "IsValID")        {            if (IsValID == false)            {                return "At least 1 Option must be selected";            }        }        return string.Empty;    }}
总结

以上是内存溢出为你收集整理的c# – ContentControl中的GroupBox – 支持由绑定到ContentControl的内容实现的IDataErrorInfo全部内容,希望文章能够帮你解决c# – ContentControl中的GroupBox – 支持由绑定到ContentControl的内容实现的IDataErrorInfo所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存