#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
? К какому типу относится класс XAMLcontaining
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 #.