2015-02-25 3 views
2

Хорошо, так что это будет трудно объяснить.WPF DataGrid добавляет строки, но не данные (пустые строки)

Сценарий:

У меня есть DataGrid определяется следующим образом:

<DataGrid Height="100" Name="test" IsReadOnly="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="URL"></DataGridTextColumn> 
     <DataGridTextColumn Header="PORT"></DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

data grid visual

Он имеет два заголовка, и мне нужно, чтобы добавить данные, я сделал много исследование, которое предполагает использование ObservableCollection, поскольку это приведет к срабатыванию события DataChanged.

Я могу сформулировать эти данные с длинным скучным кодом, который, вероятно, не имеет значения (вы увидите, почему ниже).

Проблема:

В 200 строк добавлены, но сам текст не в таблице

blank rows

Устранение:

Я включил отладку и скриншоты помогают, вы можете видеть, что есть фактические данные, но он не будет вставлять их в строки, но он добавляет строки.

Data Collection

Соответствующий код:

ObservableCollection<Proxy> collection = new ObservableCollection<Proxy>(); 
collection = GetData(ips,ports); 
test.CanUserAddRows = true; 
test.ItemsSource = null; 
test.ItemsSource = collection; 
MessageBox.Show("Done"); 

Я стучал головой о стену, пытаясь понять это.

ПРИМЕЧАНИЕ: Я добавил .ItemSource = null; а затем установите его равным коллекции, так как это позволило показать строки. Я пробовал использовать предложенную: test.DataContext = collection; Но никакие строки не добавляются вообще, и да, как и этот тест, данные видны в режиме отладки как часть контекста/itemsource.

UPDATE:

Я попытался реализации следующий XAML с теми же результатами

<DataGrid Height="100" Name="test" IsReadOnly="False" ItemsSource="{Binding collection}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="URL" Binding="{Binding ip}"></DataGridTextColumn> 
     <DataGridTextColumn Header="PORT" Binding="{Binding port}"></DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Proxy Класс:

public class Proxy 
{ 
    public string ip; 
    public string port; 
} 

UPDATE 2: При добавлении Досталось и были установлены следующие результаты:

four columns?

+0

Где вы говорите, ваше приложение что же писать в столбцах? Вы просто установите itemssource (что вы должны делать в xaml, если вы спросите меня) – user3596113

+0

Привет, вы можете объяснить немного больше, пожалуйста? Вы хотите создать DataBindings в XAML? – Kyle

+0

У вас нет привязки в вашей DataGridTextColumn и, следовательно, они не показывают никаких данных. –

ответ

8

Вы не хватает, чтобы определить свойства для привязки: по крайней мере, изменить класс Proxy, как это:

public class Proxy 
{ 
    public string ip {get; set;} 
    public string port {get; set;} 
} 
+0

Ничего себе, это очень интересно. См. Мой обновленный вопрос, такой вид работы. – Kyle

+0

Возможно, вы можете удалить столбцы автогенерации, если у вас есть явные привязки –

+0

Бинго, пришлось заставить его быть ложным. – Kyle

1

Вы должны сначала установить ItemsSource в XAML:

<DataGrid ItemsSource="{Binding test}" ... > 

Затем вы должны добавить свои TemplateColumns так:

<DataGrid ItemsSource="{Binding test}" ...> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Url}" 
              Header="URL" /> 
     <DataGridTextColumn Binding="{Binding Port}" 
              Header="Port" /> 
    </DataGrid.Columns> 
</DataGrid> 

Обратите внимание, что это потребует ваши объекты хранятся в ObservableCollection test, чтобы иметь Url и Port Porperty.

не

Измените класс модели для реализации INPC и корректировать свои свойства, как это:

public class Proxy : INPC 
{ 
    public String Url 
    { 
     get 
     { 
      return url; 
     } 
     set 
     { 
      if (url== value) { 
       return; 
      } 
      url= value; 
      RaisePropertyChanged("Url"); 
     } 
    } 
    private string url; 

    public String Port 
    { 
     get 
     { 
      return port; 
     } 
     set 
     { 
      if (port== value) { 
       return; 
      } 
      port= value; 
      RaisePropertyChanged("Port"); 
     } 
    } 
    private string port; 
} 
+0

Привет, хорошо, я дал этот снимок, и это не принесло другого результата, проверьте мой обновленный вопросник. – Kyle

+0

Вы прочитали мое последнее предложение? У вас есть какие-либо ошибки привязки в окне вывода во время выполнения? – user3596113

+0

Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: свойство 'ip' не найдено в 'object' '' Proxy '(HashCode = 6855507)'. BindingExpression: Path = ф; DataItem = 'Proxy' (HashCode = 6855507); целевым элементом является «TextBlock» (Name = ''); target свойство is 'Text' (type 'String') Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: свойство «port» не найдено в 'object' '' Proxy Да, я делаю – Kyle

2

Вы не обязательными для столбцов. Это пример того, как сделать это:

<DataGrid x:Name="RelatieSearchGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         ItemsSource="{Binding Relaties.View}" IsReadOnly="True" 
         SelectionMode="Single"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Naam" Binding="{Binding Naam}"/> 
      <DataGridTextColumn Header="Straat" Binding="{Binding Straat}"/> 
      <DataGridTextColumn Header="Postcode" Binding="{Binding Postcode}"/> 
      <DataGridTextColumn Header="Gemeente" Binding="{Binding Gemeente}"/> 
      <DataGridTextColumn Header="BTW" Binding="{Binding BTW}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

В вашем случае, поскольку коллекция содержит прокси-сервер, вы должны связываться с членами прокси. Вы не указали прокси-код, поэтому я могу только догадываться, что это за участники. Если вы хотите пройти через datacontext, вам необходимо работать с viewmodel. В этом случае я предлагаю вам сначала прочитать что-то о MVVM.

+0

Привет, я думаю, что начал реализовывать то, что вы предлагаете здесь, проверьте мой обновленный вопрос. Или я могу быть полностью вне базы – Kyle

+0

Ваша привязка должна содержать точные имена членов для прокси-сервера, то есть ip и порт, а не Url и Port. Связывание чувствительно к регистру! –

+0

Извините, я обновил вопрос и обновил свой xaml, к сожалению, никаких изменений. – Kyle

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