2016-02-16 5 views
-1

Я не могу добавить новые строки в свой DataGrid из пользовательского интерфейса. Ниже мой код.Невозможно автоматически добавить новую строку в DataGrid UI

<DataGrid CanUserAddRows="True" Name="dg" ItemsSource="{Binding list}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=.}" Header="Text"/> 
     <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>    
    </DataGrid.Columns> 
</DataGrid> 

list список строки в выше Binding .usually, когда я установил CanUserAddRows="True" я был в состоянии добавить строки в UI автоматически в других примерах.

Моя собственность выглядит следующим образом:

public List<string> list { get; set; } 

А перед показом DataGrid его инициализации. Поэтому нет необходимости реализовывать INotifyPropertyChanged для этого свойства.

Может кто-нибудь объяснить мне, почему DataGrid ведет себя так? Как добиться желаемого поведения?

+1

Насколько я знаю, когда вы привязываете DataGrid, вы не можете добавлять строки вручную. – Rodolfo

+0

@ Rodolfo уверен, что вы можете. –

+0

@ Rodolfo - пример для DataGridView. здесь не применимо –

ответ

1

Проблема заключается в том, что string не имеет конструктора без параметров, поэтому сетка не может создать новый экземпляр для пустой строки сетки, которая позволяет пользователю добавить новую строку. Кроме того, сетка не может «установить» значение «.». свойство на строку.

Один из вариантов, чтобы создать свой собственный класс, который предоставляет текстовые и Length свойства:

public class StringMember : INotifyPropertyChanged 
{ 
private string m_actualString; 
public string Text 
{ 
    get { return m_actualString; } 
    set 
    { 
     m_actualString = value; 
     //OnPropertyChanged("Text"); 
     //OnPropertyChanged("Length"); 
    } 
} 

public int Length { get { return Value.Length; } } 

//public event PropertyChangedEventHandler PropertyChanged;   
//protected virtual void OnPropertyChanged(string propertyName = null) 
//{ 
// PropertyChangedEventHandler handler = PropertyChanged; 
// if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
//} 

}

Затем ваш XAML будет связываться с вашими свойствами:

<DataGrid CanUserAddRows="True" Name="dg" ItemsSource="{Binding list}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Text}" Header="Text"/> 
     <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>    
    </DataGrid.Columns> 
</DataGrid> 

В этом случае, ваш «список» будет List<StringMember> или ObservableCollection<StringMember> вместо string.

+0

так как иметь дело с ситуацией, когда у моих классов моделей нет конструктора def. будет ли дополнительный параметр работать? –

+0

@KyloRen нет, дополнительные параметры не будут работать. –

+0

, так что вы знаете какую-либо работу вокруг этого, тогда мне не нужно создавать классы производных/оболочек? –

Смежные вопросы