Связывание данных в WPF - PullRequest
       22

Связывание данных в WPF

18 голосов
/ 28 апреля 2011

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

<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>

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

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

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; }
    }
}

Ребята, вы думаете, что-то делать со списком объектов?

Ответы [ 3 ]

32 голосов
/ 28 апреля 2011

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

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 / класс диалогового окна должен иметь Property из вашего MyObject списка.ObservableCollection<MyObject> - это путь:

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

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

<DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
   <DataGrid.Columns>                
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>
22 голосов
/ 28 апреля 2011

Не видя указанного списка объектов, я полагаю, что вы должны связывать свойство ItemsSource DataGrid, а не его 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} на сетке данных ...)

5 голосов
/ 06 ноября 2012

попробуйте сделать это в следующем коде

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...