Имеется DataGrid с одной колонкой:
<DataGrid x:Name="dataGrid"
AutoGenerateColumns="False"
HorizontalAlignment="Center"
Height="390"
Margin="10,10,9.8,20"
VerticalAlignment="Center"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
ClipboardCopyMode="None"
Grid.Column="1"
CanUserResizeColumns="False"
CanUserReorderColumns="False"
CanUserSortColumns="False">
<DataGrid.Columns >
<DataGridTextColumn Width="197"
Header="Коды"
IsReadOnly="True"
CanUserReorder="False"
CanUserResize="False"
CanUserSort="False"
x:Name="codeColumn">
</DataGridTextColumn>
</DataGrid.Columns>
Имеется класс, отвечающий за хранение нужных мне данных в нужном мне формате:
public class Code
{
public Code(string input)
{
SetValues(input);
}
private void SetValues(string input)
{
string[] splittedInput = input.Split('-');
First = splittedInput[0].ToCharArray();
Second = splittedInput[1].ToCharArray();
Third = splittedInput[2].ToCharArray();
Fourth = splittedInput[3].ToCharArray();
}
public override string ToString()
{
return $"{new string(First)}-{new string(Second)}-{new string(Third)}-{new string(Fourth)}";
}
private char[] First { get; set; } = null;
private char[] Second { get; set; } = null;
private char[] Third { get; set; } = null;
private char[] Fourth { get; set; } = null;
Сама коллекция и методы работы с ней описаны в отдельном классе:
internal class CodeCollection
{
public static ObservableCollection<Code> Codes { get; private set; }
public static void AddCode(Code newCode)
{
if (Codes == null)
{
Codes = new ObservableCollection<Code>();
}
Codes.Add(newCode);
}
public static void RemoveCode(int index)
{
if (Codes == null)
{
return;
}
Codes.RemoveAt(index);
}
}
Привязки я попробовал выставить в конструкторе окна, метод добавления в коллекцию вызывается обработчиком события:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = CodeCollection.Codes;
dataGrid.ItemsSource = CodeCollection.Codes;
_ = inputTextBox.Focus();
}
private void ButtonAdd_Click(object sender, RoutedEventArgs e)
{
App.AddCode(new Code(inputTextBox.Text));
}
}
Коллекция заполняется нужными мне данными, но проблема в том, что DataGrid ничего не выводит. Как мне нужно указать источник данных для DataGrid, чтоб он мог выводить их в описанную колонку?
= null;, если по умолчанию эти объекты и так null? Во вторых, научитесь работать без использования имени контрола, не обращайтесь к нему напрямую! Создайте класс, в котором будет находится свойство коллекции, установите его какDataContextтекущего окна/объекта и в XAML у нужного контрола задавайте ItemsSource. В 3-х. Если переопределяетеToString, то вам не нужно свойство, которое вернет строку! Сам WPF при привязке все переводит в строку сам. – EvgeniyZ Oct 15 '19 at 15:30Я создал новый класс, в который перекинул свойство коллекции. Но я не понимаю что мне нужно сделать дальше. У главного (и единственного) окна задавать DataContext? Чем его задавать, свойством коллекции? В itemsSource у DataGrid тоже свойство коллекции передать? Если так, то вывод данных из коллекции в таблицу всё ещё не работает.
– vo1d Oct 15 '19 at 15:51DataContext- это источник данных, где лежит все, что необходимо для окна. То есть задается объект, где будет ваша коллекция (прим:DataContext = new MySuperClass();).ItemsSource- тут уже задается контролу нужное публичное свойство, которое оно привяжет, такжеItemsSource- это коллекция. Свойство должно быть в классе, которое установлено какDataContext. (прим. свойства:public ObservableCollection<Code> Code { get; set;}. – EvgeniyZ Oct 15 '19 at 16:01DataGridTextColumn), туда привязываются публичные свойства, которые находятся внутри класса, тип которого указан в коллекции. Привязка производится примерно так:<DataGridTextColumn Binding="{Binding Title}">. ТутTitle- публичное свойство, которое по должно быть вCode, ибо он указан как основной тип данных в коллекции (ObservableCollection<Code>). – EvgeniyZ Oct 15 '19 at 16:01Применил изменения - всё заработало (за исключением того, что, судя по всему, при добавлении нового item в коллекцию, таблица генерит новые колонки). Плюс, пришлось убрать динамическую инициализацию коллекции - я только сейчас понял, что до этого передавал в
– vo1d Oct 15 '19 at 16:28ItemsSourcenullтаблица генерит новые колонки- если у вас стоитAutoGenerateColumns="False", то такого быть не может. – EvgeniyZ Oct 15 '19 at 16:30https://sun9-11.userapi.com/c855216/v855216005/12d3fe/Ni7npJlYhEs.jpg - при добавлении элементов
– vo1d Oct 15 '19 at 16:51