Есть разметка XAML:
Так вот, в этом случае связывание не срабатывает - отображаемый элемент - пустой. А вот если это сделать в c# коде и убрать с XAML - вуаля, все работает:
PathListView.ItemsSource = ViewModel.MainViewModel.SettingModel.CollectionPaths;
В чем разница между тем, как привязывать, в xaml или c# коде? Почему в одном случае работает, а в другом - нет?
Обе коллекции ObservableCollection<>
UPD Код модели:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
namespace DocumentAdder.Model
{
[DataContract]
public class SettingsModel : BaseModel
{
#region Fields
private string _pathToDirectory;
private string _fileTypes;
private ObservableCollection
#region Properties
///
///
///
///
Код ViewModel:
using DocumentAdder.Helpers;
using DocumentAdder.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Microsoft.WindowsAPICodePack.Dialogs;
namespace DocumentAdder.ViewModel
{
public class MainViewModel
{
public MainModel DocumentAdderModel { get; private set; }
public static SettingsModel SettingModel { get; set; }
#region Commands
//main programm commands
public ICommand StartProgrammCommand { get; private set; }
public ICommand StopProgrammCommand { get; private set; }
public ICommand RestartProgrammCommand { get; private set; }
//settings commands
public ICommand AddLocalStorageCommand { get; private set; }
#endregion
#region Methods
//main programm methods
//settings methods
private void addLocalStorage()
{
List
private void addFTPStorage()
{
}
#endregion
static MainViewModel()
{
if (SettingModel == null)
{
var single = new SettingsModel();
SettingModel = single;
}
}
public MainViewModel()
{
DocumentAdderModel = new MainModel();
AddLocalStorageCommand = new DelegateCommand(arg => addLocalStorage());
}
}
}
Код XAML окна:
Весь проект
Ответ
Попытался составить минимально воспроизводимый пример. Просьба к автору поправить, если я неверно понял задачу.
Есть нестатический класс с нестатическим свойством-коллекцией:
public class Model
{
public ObservableCollection
public Model()
{
Collection = new ObservableCollection
Есть модель представления окна, в которой данный класс фигурирует в виде статического свойства и которая умеет добавлять элементы в коллекцию:
public class MainVm
{
private int currentItem;
public static Model Model { get; }
static MainVm()
{
if (Model == null)
{
Model = new Model();
}
}
public MainVm()
{
AddItemToCollectionCommand = new RelayCommand(() => Model.Collection.Add((++currentItem).ToString()));
}
public ICommand AddItemToCollectionCommand { get; }
}
Есть представление, которое должно показывать перечень элементов коллекции в ListBox:
Если организовать привязку таким образом, то код будет работать.
UPD
@Ep1demic, во-первых, в привязке не Collection, а CollectionPaths. Во-вторых, проблема в том, что вы заново устанавливаете значение статического свойства. Т.е. получается следующее:
Создали класс MainViewModel.
Отработал Binding к SettingModel.CollectionPaths (т.е. к значению созданному в статическом конструкторе).
Значение свойства SettingModel изменилось.
В итоге привязка работает, но к пустой коллекции. Так что вам нужно что-то с этим придумать. Либо найти способ оповещать внешний код об изменении статического свойства, либо избавиться от статики, либо не менять значение свойства.
Комментариев нет:
Отправить комментарий