Он никогда не увеличит набор Nodes
, потому что вы не создаете новый экземпляр ObservableCollection, вы добавляете в него элементы, которые не поднимают набор. Набор ObservableCollection
повышается при изменении экземпляра.
Nodes.Add( new MyModel()) -> "Doesn't raise the set."
ObservableCollection<MyModel> myModelOC = new ObservableCollection<MyModel>() { "Declare 3 items" };
Nodes = myModelOC -> "This will raise the set".
Теперь, когда я объяснил это (надеюсь, я объяснил сам, если не просто дать мне знать), я хотел бы задать вам несколько вопросов. Я вижу это:
public TableView()
{
InitializeComponent();
co = new ViewModel();
base.DataContext = co;
}
Это ваш xaml.cs?
В любом случае, я бы сказал, что ваша проблема в том, что вы устанавливаете DataContext
, а затем с помощью другого частного метода создаете новую ВМ, поэтому экземпляр вашей 101 * * и виртуальной машины, которую вы создаете в своей частной жизни, полностью иначе, поэтому вы не получаете обновленный DataGrid
, вы обновляете виртуальную машину, которая не установлена как DataContext
в представлении.
Пожалуйста, отредактируйте свое сообщение и укажите, куда вы звоните, AddNode
и как вы показываете свой вид, чтобы я мог рассказать вам, как это исправить.
Прежде всего, это не следует MVVM, так как вы помещаете код в свой код Viewbehind:
ViewModel co;
public TableView()
{
SQL.InsertNode();
InitializeComponent();
co = new ViewModel();
base.DataContext = co;
}
public void AddNode()
{
SQL.InsertNode();
co.Nodes.Clear();
co.FillList();
}
Перед тем, как сделать TableView.Show()
, вам нужно создать ViewModel и установить TableView
DataContext
. Было бы что-то вроде этого:
ViewModel yourViewModel = new ViewModel();
TableView tableView = new TableView();
tableView.DataContext = yourViewModel;
tableView.Show();
И ваш TableView.xaml.cs
конструктор должен быть таким:
public TableView()
{
InitializeComponent();
}
И ваш ViewModel
конструктор должен быть таким:
public ViewModel()
{
FillList();
Nodes.Clear();// You could do this if you need it to be cleared
}
Как говорится, для вашей реальной проблемы я предлагаю вам использовать события. Это действительно зависит от того, как строится ваша архитектура. Я приведу возможный подход:
Создайте новый класс, который будет содержать ваше событие, например:
public static class UpdaterEvent
{
public static event EventHandler DataUpdated;
public static void PublishDataUpdated(EventArgs args)
{
var updaterEvent = DataUpdated;
if (updaterEvent != null)
updaterEvent(null, args);
}
}
Теперь в вашем конструкторе ViewModel добавьте:
public ViewModel()
{
FillList();
Nodes.Clear();// You could do this if you need it to be cleared
UpdaterEvent.DataUpdated += OnDataUpdated;
}
private void OnDataUpdated(object sender, EventArgs e)
{
FillList();
}
Всякий раз, когда вам нужно обновить ваши данные, просто сделайте следующее:
UpdaterEvent.PublishDataUpdated(new EventArgs());