DataGridTextColumn WPFXAMLのTargetNullValueプロパティにバインディング値を設定するにはどうすればよいですか

エレーラ王

SQL Serverの場合のように、BindingプロパティがNull値を与える場合に備えて、DataGridTextColumnにデフォルト値を設定しようとしています...

そこで、私はプロパティTargetNullValueを調査して見つけました。ここで、列にnullがある場合にデフォルト値を設定できます。

しかし、私がやっているように機能していません。次のエラーをスローします

System.Windows.Markup.XamlParseException: 'A' Binding 'は、タイプ' Binding 'の' TargetNullValue 'プロパティに設定できません。「バインディング」は、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にバインドされています。

よろしくお願いします!

*クラスを更新

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);
    }
}

**そして最後に、デバッグモードでのクエリの結果が返されます...

ViewSourceの結果

ジェームズ

にバインドすることはできませんTargetNullValueそこにはハードコードされた値しか入れることができません。バインドする場合DataGridTemplateColumnは、Textblockとを使用し、でを使用しDataTriggerて値を変更できます。

だから、デフォルトTextblockにバインドするためにMunicipio、それはだ場合、{x:Null}後にバインド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>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ