Здесь я вижу несколько проблем.
Первая строка, которую вы используете для создания привязки:
Binding b = new Binding("ValuesBinding");
Это не будет делать то, что вы хотите.Строка ValuesBinding
используется как путь к свойству, а у коллекции ObservableCollection, к которой вы привязываете DataGrid, нет свойства с именем ValuesBinding
.Действительно, если вы посмотрите в окно VS Output, вы должны увидеть сообщение, такое как
System.Windows.Data Error: BindingExpression path error: 'ValuesBinding' property not found on 'System.Collections.ObjectModel.ObservableCollection`1 ...
Однако, если вы удалите "ValuesBinding"
из вышеприведенного, чтобы оставить вас с
Binding b = new Binding();
тогда вы получите ошибку о двухсторонних привязках, нуждающихся в Path.Однако здесь вам не нужно двустороннее связывание.Вы можете просто удалить строку b.Mode = BindingMode.TwoWay;
и ошибка исчезнет.
Двусторонние привязки используются, чтобы позволить слою вида устанавливать свойства в слое модели вида.Path указывает, где найти свойство view-model для установки.Тем не менее, поскольку вы привязываете напрямую к коллекции, свойство не задействовано и, следовательно, ничего не может установить на уровне представления.
В вашем случае эта привязка не обязательно должна быть двусторонней.Изменения в самой коллекции (например, добавление или удаление элементов) все еще могут быть сделаны, даже если используется односторонняя привязка для ItemsSource.Двусторонние привязки, которые есть в свойствах Label
и YValue
вашего класса Value
, также будут работать так, как вы ожидаете.Установка односторонней привязки для ItemSrid ItemsSource не делает всю сетку доступной только для чтения.
Наконец, я не уверен, почему вы создаете привязку в коде для привязки к коллекции.уже доступно в коде позади.Вы можете добиться того же, просто написав
MyGrid.ItemsSource = values;