Pregunta

Estoy creando una ventana de WPF con una DataGrid, y yo quiero mostrar el "nuevo tema" fila en blanco en la parte inferior de la parrilla que me permite añadir un nuevo elemento a la cuadrícula. Por alguna razón, la fila en blanco no se muestra en la parrilla en mi ventana. Aquí está el marcado he utilizado para crear el DataGrid:

<toolkit:DataGrid  x:Name="ProjectTasksDataGrid" 
                   DockPanel.Dock="Top" 
                   Style="{DynamicResource {x:Static res:SharedResources.FsBlueGridKey}}"
                   AutoGenerateColumns="False" 
                   ItemsSource="{Binding SelectedProject.Tasks}" 
                   RowHeaderWidth="0" 
                   MouseMove="OnStartDrag" 
                   DragEnter="OnCheckDropTarget" 
                   DragOver="OnCheckDropTarget" 
                   DragLeave="OnCheckDropTarget" 
                   Drop="OnDrop" 
                   InitializingNewItem="ProjectTasksDataGrid_InitializingNewItem">
    <toolkit:DataGrid.Columns>
        <toolkit:DataGridCheckBoxColumn HeaderTemplate="{DynamicResource {x:Static res:SharedResources.CheckmarkHeaderKey}}" Width="25" Binding="{Binding Completed}" IsReadOnly="false"/>
        <toolkit:DataGridTextColumn Header="Days" Width="75" Binding="{Binding NumDays}" IsReadOnly="false"/>
        <toolkit:DataGridTextColumn Header="Due Date" Width="75" Binding="{Binding DueDate, Converter={StaticResource standardDateConverter}}" IsReadOnly="false"/>
        <toolkit:DataGridTextColumn Header="Description" Width="*" Binding="{Binding Description}" IsReadOnly="false"/>
    </toolkit:DataGrid.Columns>
</toolkit:DataGrid>

No puedo entender por qué la fila en blanco no se muestra. He tratado de las cosas obvias (IsReadOnly="false", CanUserAddRows="True"), sin suerte. Cualquier idea de por qué la fila en blanco se desactiva? Gracias por su ayuda.

¿Fue útil?

Solución

Vicente Sibal ha publicado una artículo que describe lo que se requiere para añadir nuevas filas a una cuadrícula de datos . Hay bastantes posibilidades, y la mayor parte de esto depende del tipo de colección que está utilizando para SelectedProject.Tasks.

Yo recomendaría asegurándose de que "Tareas" no es una única colección de leer, y que es compatible con una de las interfaces necesarias (mencionado en el enlace anterior) para permitir que los nuevos elementos que se añaden correctamente con cuadrícula de datos.

Otros consejos

También debe tener un constructor por defecto del tipo de la colección.

Finalmente consiguió de nuevo a éste. No voy a cambiar la respuesta aceptada (marca verde), pero aquí es la causa del problema:

Mi envuelve Ver Modelo clases de dominio para proporcionar la infraestructura necesaria para WPF. Escribí un CodeProject artículo en el método de envoltura que utilizo , que incluye una clase de colección que tiene dos parámetros de tipo:

VmCollection<VM, DM>

donde DM es una clase de dominio envuelto, y DM es la clase de WPF que lo envuelve.

truns que, por alguna extraña razón, teniendo el segundo parámetro de tipo en la clase de colección hace que el WPF DataGrid para convertirse en no editable. La solución es eliminar el segundo parámetro de tipo.

No se puede decir por qué esto funciona, sólo que lo hace. Espero que ayude a alguien más en el camino.

En mi opinión, esto es un error en la cuadrícula de datos. de Mike Blandford enlace me ayudó para finalmente darse cuenta de cuál es el problema: la cuadrícula de datos no reconoce el tipo de las filas hasta que tenga un objeto real con destino. La fila de edición no aparece b / c la cuadrícula de datos no conoce los tipos de columna. Se podría pensar que la unión de una colección con establecimiento inflexible funcionaría, pero no lo hace.

Para ampliar la respuesta de Mike Blandford, debe asignar primero la colección vacía y luego añadir y eliminar una fila. Por ejemplo,

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // data binding
        dataGridUsers.ItemsSource = GetMembershipUsers();
        EntRefUserDataSet.EntRefUserDataTable dt = (EntRefUserDataSet.EntRefUserDataTable)dataGridUsers.ItemsSource;
        // hack to force edit row to appear for empty collections
        if (dt.Rows.Count == 0)
        {
            dt.AddEntRefUserRow("", "", false, false);
            dt.Rows[0].Delete();
        }
    }

Añadir un elemento vacío al ItemsSource y luego eliminarlo. Puede que tenga que configurar de nuevo a CanUserAddRows cierto después de hacer esto. He leído esta solución aquí : (Mensajes de Jarrey y Rick Roen)

he tenido este problema cuando me puse la ItemsSource a DefaultView de un DataTable y la vista estaba vacío. Las columnas se definen aunque por lo que debería haber sido capaz de conseguirlos. Je.

Para mí la mejor manera de poner en práctica DataGrid asíncrono editable se parece a lo siguiente:

Ver Modelo:

 public class UserTextMainViewModel : ViewModelBase
{ 
    private bool _isBusy;
    public bool IsBusy
    {
        get { return _isBusy; }
        set
        {
            this._isBusy = value;
            OnPropertyChanged();
        }
    }




    private bool _isSearchActive;
    private bool _isLoading;


    private string _searchInput;
    public string SearchInput
    {
        get { return _searchInput; }
        set
        {
            _searchInput = value;
            OnPropertyChanged();

            _isSearchActive = !string.IsNullOrEmpty(value);
            ApplySearch();
        }
    }

    private ListCollectionView _translationsView;
    public ListCollectionView TranslationsView
    {
        get
        {
            if (_translationsView == null)
            {
                OnRefreshRequired();
            }

            return _translationsView;
        }
        set
        {
            _translationsView = value;
            OnPropertyChanged();
        }
    }


    private void ApplySearch()
    {
        var view = TranslationsView;

        if (view == null) return;

        if (!_isSearchActive)
        {
            view.Filter = null;
        }
        else if (view.Filter == null)
        {
            view.Filter = FilterUserText;
        }
        else
        {
            view.Refresh();
        }
    }

    private bool FilterUserText(object o)
    {
        if (!_isSearchActive) return true;

        var item = (UserTextViewModel)o;

        return item.Key.Contains(_searchInput, StringComparison.InvariantCultureIgnoreCase) ||
               item.Value.Contains(_searchInput, StringComparison.InvariantCultureIgnoreCase);
    }




    private ICommand _clearSearchCommand;
    public ICommand ClearSearchCommand
    {
        get
        {
            return _clearSearchCommand ??
                   (_clearSearchCommand =
                    new DelegateCommand((param) =>
                    {
                        this.SearchInput = string.Empty;

                    }, (p) => !string.IsNullOrEmpty(this.SearchInput)));
        }
    }

    private async void OnRefreshRequired()
    {
        if (_isLoading) return;

        _isLoading = true;
        IsBusy = true;
        try
        {
            var result = await LoadDefinitions();
            TranslationsView = new ListCollectionView(result);
        }
        catch (Exception ex)
        {
            //ex.HandleError();//TODO: Needs to create properly error handling
        }

        _isLoading = false;
        IsBusy = false;
    }


    private async Task<IList> LoadDefinitions()
    {
        var translatioViewModels = await Task.Run(() => TranslationRepository.Instance.AllTranslationsCache
        .Select(model => new UserTextViewModel(model)).ToList());
        return translatioViewModels;
    }


}

XAML

<UserControl x:Class="UCM.WFDesigner.Views.UserTextMainView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:model="clr-namespace:Cellebrite.Diagnostics.Model.Entities;assembly=Cellebrite.Diagnostics.Model"
         xmlns:System="clr-namespace:System;assembly=mscorlib"
         xmlns:converters1="clr-namespace:UCM.Infra.Converters;assembly=UCM.Infra"
         xmlns:core="clr-namespace:UCM.WFDesigner.Core"
         mc:Ignorable="d"
         d:DesignHeight="300"
         d:DesignWidth="300">


<DockPanel>
    <StackPanel Orientation="Horizontal"
                DockPanel.Dock="Top"
                HorizontalAlignment="Left">


        <DockPanel>

            <TextBlock Text="Search:"
                       DockPanel.Dock="Left"
                       VerticalAlignment="Center"
                       FontWeight="Bold"
                       Margin="0,0,5,0" />

            <Button Style="{StaticResource StyleButtonDeleteCommon}"
                    Height="20"
                    Width="20"
                    DockPanel.Dock="Right"
                    ToolTip="Clear Filter"
                    Command="{Binding ClearSearchCommand}" />

            <TextBox Text="{Binding SearchInput, UpdateSourceTrigger=PropertyChanged}"
                     Width="500"
                     VerticalContentAlignment="Center"
                     Margin="0,0,2,0"
                     FontSize="13" />

        </DockPanel>
    </StackPanel>
    <Grid>
        <DataGrid ItemsSource="{Binding Path=TranslationsView}"
                  AutoGenerateColumns="False"
                  SelectionMode="Single"
                  CanUserAddRows="True">
            <DataGrid.Columns>
              <!-- your columns definition is here-->
            </DataGrid.Columns>
        </DataGrid>
        <!-- your "busy indicator", that shows to user a message instead of stuck data grid-->
        <Border Visibility="{Binding IsBusy,Converter={converters1:BooleanToSomethingConverter TrueValue='Visible', FalseValue='Collapsed'}}"
                Background="#50000000">
            <TextBlock Foreground="White"
                       VerticalAlignment="Center"
                       HorizontalAlignment="Center"
                       Text="Loading. . ."
                       FontSize="16" />
        </Border>
    </Grid>
</DockPanel>

Este patrón permite trabajar con la red de datos de una manera bastante simple y el código es muy simple tampoco. No se olvide de crear constructor por defecto para la clase que representa el origen de datos.

Esta happned a mí, me olvidé de nuevo hasta la instancia y fue pesadilla para mí. Una vez que crea una instancia de la colección en onviewloaded se resolvió.

`observablecollection<T> _newvariable = new observablecollection<T>();`

esto solucionó mi problema. Esperamos que puede ayudar a los demás

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top