gpt4 book ai didi

c# - 如何在 DataGridTextColumn WPF XAML 中将绑定(bind)值设置为 TargetNullValue 属性

转载 作者:行者123 更新时间:2023-12-05 05:14:01 24 4
gpt4 key购买 nike

我正在尝试在我的 DataGridTextColumn 上设置一个默认值,以防绑定(bind)属性给出 Null 值,就像在 sql server 中...

所以我研究并找到了 TargetNullValue 属性,我可以在其中放置默认值以防列为空。

但是没有像我那样工作。抛出下一个错误

System.Windows.Markup.XamlParseException:无法在“绑定(bind)”类型的“TargetNullValue”属性上设置“绑定(bind)”。 “绑定(bind)”只能在 DependencyObject 的 DependencyProperty 上设置。’

这是我的 XAML 代码示例。

<DataGrid x:Name="proveedorDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding IsAsync=True}" Margin="15,50,25,70" RowDetailsVisibilityMode="VisibleWhenSelected"
SelectionMode="Single" IsReadOnly="True" CanUserAddRows="False" CanUserResizeRows="False" CanUserDeleteRows="False" PreviewKeyDown="ProveedorDataGrid_OnPreviewKeyDown">
<DataGrid.Columns>
<DataGridTextColumn x:Name="municipioColumn" Binding="{Binding Municipio, TargetNullValue={Binding CCodigoPostal.Municipio}}" Header="Municipio" Width="Auto" />
</DataGrid.Columns>
</DataGrid>

以目前的资源

<Window.Resources>
<CollectionViewSource x:Key="proveedorViewSource" d:DesignSource="{d:DesignInstance {x:Type Core:Proveedor}, CreateList=True}"/>
</Window.Resources>

实际上是使用 DataSource 与 EntityFramework 绑定(bind)...

提前致谢!

*更新类

public class Proveedor
{
public Proveedor()
{
ValeVehiculoCombustibles = new HashSet<ValeVehiculoCombustible>();
FacturaProveedors = new HashSet<FacturaProveedor>();
EntradaBasculas = new HashSet<EntradaBascula>();
}

public Guid? Id_Proveedor { get; set; }

public string Codigo { get; set; }

public string RazonSocial { get; set; }

public string Calle { get; set; }

public string Colonia { get; set; }

public virtual C_CodigoPostal CCodigoPostal { get; set; }
public int CCodigoPostalId { get; set; }

public string Telefonos { get; set; }

public string RFC { get; set; }

public virtual CuentaContable CuentaContable { get; set; }
public Guid? CuentaContableId { get; set; }

public short DiasCred { get; set; }

public decimal SaldoMN { get; set; }

public decimal AnticipoMN { get; set; }

public decimal SaldoDlls { get; set; }

public decimal AnticipoDlls { get; set; }

public string Contacto { get; set; }

public string Email { get; set; }

public string Municipio { get; set; }

public string Estado { get; set; }

public string Ciudad { get; set; }

public bool Estatus { get; set; }

public DateTime Actualizado { get; set; }

public virtual ICollection<ValeVehiculoCombustible> ValeVehiculoCombustibles { get; set; }
public virtual ICollection<FacturaProveedor> FacturaProveedors { get; set; }
public virtual ICollection<EntradaBascula> EntradaBasculas { get; set; }
}

** 和他的配置

public class ProveedorConfiguration : EntityTypeConfiguration<Proveedor>
{
public ProveedorConfiguration()
{
ToTable("Proveedor");

//PK
HasKey(p => p.Id_Proveedor);

Property(p => p.Id_Proveedor)
.IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Property(p => p.Codigo)
.IsRequired()
.HasColumnType("varchar")
.HasMaxLength(6);
HasIndex(p => p.Codigo)
.IsUnique();

Property(p => p.RazonSocial)
.IsRequired()
.HasColumnType("varchar")
.HasMaxLength(60);

Property(p => p.Calle)
.IsRequired()
.HasColumnType("varchar")
.HasMaxLength(40);

Property(p => p.Colonia)
.HasColumnType("varchar")
.HasMaxLength(30);

Property(p => p.CCodigoPostalId)
.IsRequired()
.HasColumnType("int");

Property(p => p.Telefonos)
.HasColumnType("varchar")
.HasMaxLength(30);

Property(p => p.RFC)
.HasColumnType("varchar")
.HasMaxLength(13);
HasIndex(p => p.RFC)
.IsUnique();

Property(p => p.CuentaContableId)
.IsRequired();

Property(p => p.DiasCred)
.IsRequired()
.HasColumnType("smallint");

Property(p => p.SaldoMN)
.IsRequired()
.HasColumnType("decimal")
.HasPrecision(10, 2);

Property(p => p.AnticipoMN)
.IsRequired()
.HasColumnType("decimal")
.HasPrecision(10, 2);

Property(p => p.SaldoDlls)
.IsRequired()
.HasColumnType("decimal")
.HasPrecision(8, 2);

Property(p => p.AnticipoDlls)
.IsRequired()
.HasColumnType("decimal")
.HasPrecision(8, 2);

Property(p => p.Contacto)
.HasColumnType("varchar")
.HasMaxLength(60);

Property(p => p.Email)
.HasColumnType("varchar")
.HasMaxLength(90);

Property(p => p.Municipio)
.HasColumnType("varchar")
.HasMaxLength(50);

Property(p => p.Estado)
.HasColumnType("varchar")
.HasMaxLength(31);

Property(p => p.Ciudad)
.HasColumnType("varchar")
.HasMaxLength(45);

Property(p => p.Estatus)
.IsRequired();

//Relationships
//FK Proveedor -> ValeVehiculoCombustible
HasMany(p => p.ValeVehiculoCombustibles)
.WithOptional(v => v.Proveedor)
.HasForeignKey(v => v.ProveedorId)
.WillCascadeOnDelete(false);

//PK Proveedor -> FacturaProveedor
HasMany(p => p.FacturaProveedors)
.WithRequired(f => f.Proveedor)
.HasForeignKey(f => f.ProveedorId)
.WillCascadeOnDelete(false);

//FK Proveedor -> EntradaBasucla
HasMany(p => p.EntradaBasculas)
.WithRequired(e => e.Proveedor)
.HasForeignKey(e => e.ProveedorId)
.WillCascadeOnDelete(false);
}
}

** 最后,这是在 Debug模式下查询的返回结果...

ViewSource Result

最佳答案

您不能绑定(bind)到 TargetNullValue。您只能在其中放置一个硬编码值。如果要绑定(bind),可以将 DataGridTemplateColumnTextblock 一起使用,并在其上使用 DataTrigger 来更改值。

因此,默认 Textblock 绑定(bind)到 Municipio,然后如果它是 {x:Null},则将其绑定(bind)到 CCodigoPostal.Municipio.

<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Municipio}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding Path=Municipio}"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Municipio}" Value="{x:Null}">
<Setter Property="Text" Value="{Binding Path=CCodigoPostal.Municipio}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>

如果你想超越(并正确地做),你可以在你的资源中创建一个 DataTemplate 并只引用它而不是将所有 xaml 正确的在线。

如果您想使用资源,您可以将 DataTemplate 放入您的 Windows.Resources 中。

 <Window.Resources>
<DataTemplate x:Key="template">
<TextBlock Text="{Binding Path=Municipio}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding Path=Municipio}"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Municipio}" Value="{x:Null}">
<Setter Property="Text" Value="{Binding Path=CCodigoPostal.Municipio}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</Window.Resources>

然后,设置CellTemplate

 <DataGrid x:Name="grid" Grid.Row="3">
<DataGrid.Columns>
<DataGridTemplateColumn CellTemplate="{StaticResource template}">
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

关于c# - 如何在 DataGridTextColumn WPF XAML 中将绑定(bind)值设置为 TargetNullValue 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52900972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com