Привязка сетки данных в WPF

#c# #wpf #xaml #binding #datagrid

#c# #wpf #xaml #привязка #сетка данных

Вопрос:

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

 <DataGrid x:Name="Imported" VerticalAlignment="Top"
          DataContext="{Binding Source=list}"
          AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/>
    </DataGrid.Columns>
</DataGrid>
  

Я пытаюсь показать это в модальном диалоговом окне и заполняю список лицензий в конструкторе модального диалогового окна.
Но внутри по-прежнему ничего не заполняется DataGrid .

Код конструктора:

 public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
}
public class object
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}
  

Ребята, как вы думаете, это как-то связано со списком объектов?

Комментарии:

1. Мой объект list имеет больше других свойств, чем два вышеуказанных, которые я не привязываю? это могло бы внести какие-либо изменения?

2. Вероятно, нет. Пожалуйста, поделитесь еще некоторыми сведениями о вашем XAML (включая то, как list определяется), чтобы мы могли помочь в дальнейшем.

3. Я добавил код сверху.

4. @alice7 Какой тип diagboxclass ? К какому типу относится класс XAML containing DataGrid? Если diagboxclass это находится в коде файла XAML, вы должны присвоить list этому DataContext свойству этого класса. Затем вы должны иметь возможность привязываться к списку из XAML.

5. Привет, если один из ответов помог вам в 2011 году, пожалуйста, отметьте его как ответ, спасибо

Ответ №1:

ПОЖАЛУЙСТА, не используйте object в качестве имени класса:

 public class MyObject //better to choose an appropriate name
{
    string id;
    DateTime date;
    public string ID
    {
       get { return id; }
       set { id = value; }
    }
    public DateTime Date
    {
       get { return date; }
       set { date = value; }
    }
}
  

Вы должны реализовать INotifyPropertyChanged для этого класса и, конечно, вызвать его в параметре установки свойств. В противном случае изменения не отражаются в вашем пользовательском интерфейсе.

В вашем классе Viewmodel / dialogbox должен быть Property ваш MyObject список. ObservableCollection<MyObject> это правильный путь:

 public ObservableCollection<MyObject> MyList
{
     get...
     set...
}
  

В вашем xaml вы должны установить Itemssource для вашей коллекции MyObject . ( Datacontext это должен быть ваш класс dialogbox!)

 <DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
   <DataGrid.Columns>                
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>
  

Комментарии:

1. В моем случае ItemSource сетки данных должен быть: ItemsSource=»{Привязка myList}»

Ответ №2:

Не видя указанного списка объектов, я считаю, что вы должны привязываться к DataGrid свойству ItemsSource DataContext , а не к его, и это не так, я полагаю.

 <DataGrid x:Name="Imported" VerticalAlignment="Top"
          ItemsSource="{Binding Source=list}"
          AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>
  

(Это предполагает, что элемент [ UserControl и т.д.], который содержит DataGrid , имеет DataContext свою list привязку к объекту, который содержит в себе,, коллекцию. DataGrid Является производным от ItemsControl , которое полагается на свое ItemsSource свойство для определения коллекции, к которой оно привязывает свои строки. Следовательно, если list это не свойство объекта, привязанного к вашему элементу управления DataContext , вам может потребоваться установить оба DataContext={Binding list} и ItemsSource={Binding list} для DataGrid ).

Комментарии:

1. @alice7 Тогда, пожалуйста, опубликуйте какой-нибудь XAML, показывающий остальную часть вашего Window / UserControl / Всего, что содержит сетку, и сообщите нам, как list это определено. 🙂

2. Я удалил все содержимое и просто оставил datagrid.so другого элемента управления нет. Вот конструктор code isnide: Список<объект> Список объектов = новый список<объект>(); Список объектов = GetObjectList();

3. Внутри конструктора … что? Пожалуйста, отредактируйте свой вопрос (нажмите на edit ссылку, которая появляется под тегами), чтобы включить дополнительный код; это довольно сложно прочитать в комментарии. Спасибо 🙂

4. @alice7: Вам нужно предоставить этот список как общедоступное свойство и задать соответствующий DataContext, вероятно, вам следует прочитать эту ссылку .

5. Привязка в свойстве ItemsSource, возможно, неправильная. В моем случае я не добился успеха, когда объявил привязку с помощью «{Источник привязки = список}». Но я добился успеха, когда объявил привязку с помощью «{Список привязки}».

Ответ №3:

Попробуйте сделать это в исходном коде:

 public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
    Imported.ItemsSource = null;
    Imported.ItemsSource = list;
}
  

Также убедитесь, что ваш список эффективно заполнен, и, как упоминалось @Blindmeis, никогда не используйте слова, которым уже присвоена функция в C #.