Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Bind DataGrid MyClass


Автор: DenWPF 2.7.2010, 11:30
не могу понять как так биндить?

у меня есть класс MyClass с полями  string name и int age

Автор: SergeyLoginov 2.7.2010, 12:34
Если вопрос в том, как создать таблицу DataGrid на основе списка объектов класса MyClass, то надо для начала организовать в контексте данных публичное свойство - коллекцию объектов этого класса (public ObservableCollection<MyClass> MyClassObjects { get; set; }), заполнить ее. И привязать к свойству ItemsSource таблицы: 
Код

<DataGrid ItemsSource="{Binding MyClassObjects }"/>

Таблица будет создана автоматически. Если свойству AutoGenerateColumns таблицы присвоить значение False, то вид и содержание столбцов будут определяться программистом в xaml. В интернете, в общем-то, полно инфы. Поэтому если и задавать тут вопрос, то надо как-то конкретней.

Автор: DenWPF 2.7.2010, 13:41
Код

ObservableCollection<Project> projects = new ObservableCollection<Project>();
        public ObservableCollection<Project> GetProjects { get { return projects; } }


если так 
Код

                   <Custom:DataGrid Background="{x:Null}" x:Name="datagrid" AutoGenerateColumns="False">
                        <GridView>
                            <GridViewColumn Width="140" Header="Game Name" DisplayMemberBinding="{Binding Title}"  />
                        </GridView>
                    </Custom:DataGrid>

и в коде потом дописать 

Код

datagrid.ItemsSource = GetProjects;

то выдает ошибку что типо есть уже items.

если в хамле указать itemssource то там другая ошибка с Convertom или что то в этом роде.

Автор: SergeyLoginov 2.7.2010, 15:35
Дело в том, что описывая таблицу так
Код

                   <Custom:DataGrid Background="{x:Null}" x:Name="datagrid" AutoGenerateColumns="False">
                        <GridView>
                            <GridViewColumn Width="140" Header="Game Name" DisplayMemberBinding="{Binding Title}"  />
                        </GridView>
                    </Custom:DataGrid>
 
Ты задаешь Items коллекцией из одного элемента - объекта GridView. Поэтому и такая ошибка. Если ты таким образом пытаешься задать вид столбцов, то это делается иначе:
Код

<Custom:DataGrid ItemsSource="{Binding GetProjects}" AutoGenerateColumns="False">                         
     <Custom:DataGrid.Columns>
          <Custom:DataGridTextColumn Binding="{Binding Title}" Header="Game Name"/>
     </Custom:DataGrid.Columns>
</Custom:DataGrid>


При этом получишь ровным счетом то же, что и в случае:
Код

    <Custom:DataGrid ItemsSource="{Binding GetProjects}" />                         

Вообще, задать вид столбцов можно очень даже нетривиальный. Но тут надо поковыряться. 
Почитай статейки (http://blogs.msdn.com/b/jaimer/archive/2008/08/11/dabbling-around-the-new-wpf-datagrid-part-1.aspx, http://dev.net.ua/blogs/servicedeveloper/archive/2008/09/05/6829.aspx). Попробуй сделать как я описал (с помощью привязки, а не назначения свойству ItemsSource значения в коде). Будет ошибка - предоставь код класса, xaml'а и текст ошибки.

Автор: DenWPF 3.7.2010, 10:37
так будет работать, но только если вызвать в коде datagrid.ItemsSource = GetProjects;

как обновить datagrid если добавились новые значения

автоматически это конечно хорошо, но мне надо не все поля из того класса.




Автор: DenWPF 3.7.2010, 13:36
А как связать сразу не сколько?

ну вот у меня есть класс 


Код

    public class Project
    {
        public Project() { }

        private string _title = "1";
        private string _smallDescription = "";
        private string _description = "";
        private string _url = "";
        private int _price = 0;
        private DateTime _datetime = new DateTime();

        //public status = Status

        public string Title { get { return _title; } set { _title = value; } }
        public string SmallDescription { get { return _smallDescription; } set { _smallDescription = value; } }
        public string Description { get { return _description; } set { _description = value; } }
        public string Url { get { return _url; } set { _url = value; } }
        public int Price { get { return _price; } set { _price = value; } }
        public DateTime DateTime { get { return _datetime; } set { _datetime = value; } }
    }
    class Category
    {
        public Category() { }

        private string _title;
        private List<PodCategory> _podcategory = new List<PodCategory>();
        private string _img = "bez_gmo.jpg";

        public string Title { get { return _title; } set { _title = value; } }
        public List<PodCategory> PodCategory { get { return _podcategory; } set { _podcategory = value; } }
        public string Image { get { return _img; } set { _img = value; } }
    }
    class PodCategory
    {
        public PodCategory() { }

        private string _title;
        private List<Project> _projects = new List<Project>();
        private string _img = "bez_gmo.jpg";

        public string Title { get { return _title; } set { _title = value; } }
        public List<Project> Projects { get { return _projects; } set { _projects = value; } }
        public string Image { get { return _img; } set { _img = value; } }
    }

и хочется забиндить их Category и PodCategory - в Menu а когда выберается под категория в DataGrid Высвечивается инфа из PodCategory.Project 

а при выбере в Datagrid элемента то в RichTextBox - высвечивается инфа из Project часть.

я щас сам это буду пытаться , но думаю у меня не фига не выйдет. прелогаю проект.



http://depositfiles.com/files/u8jfxlvvc

Автор: SergeyLoginov 5.7.2010, 08:27
Цитата(DenWPF @ 3.7.2010,  10:37)
так будет работать, но только если вызвать в коде datagrid.ItemsSource = GetProjects;

как обновить datagrid если добавились новые значения

Для того, чтобы DataGrid обновлялся автоматически, надо, чтобы свойство GetProjects имело тип ObservableCollection<Project>. Тогда при изменении (добавлении/удалении) элементов этой коллекции будет изменяться и таблица. А чтобы и содержание таблицы было актуальным значениям элементов коллекции, надо чтобы класс Project поддерживал интерфейс INotifyPropertyChanged (поищи про это в инете, информации полно).

Добавлено через 1 минуту и 44 секунды
Цитата(DenWPF @ 3.7.2010,  13:36)
А как связать сразу не сколько?

ну вот у меня есть класс 

и хочется забиндить их Category и PodCategory - в Menu а когда выберается под категория в DataGrid Высвечивается инфа из PodCategory.Project 

а при выбере в Datagrid элемента то в RichTextBox - высвечивается инфа из Project часть.

я щас сам это буду пытаться , но думаю у меня не фига не выйдет. 

Все это возможно. Разбирайся, задавай конкретные вопросы - получится smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)