Не срабатывает сеттер при изменение в DataGrid ObservableCollection<T>

199
28 октября 2017, 14:21

Есть такая проблема при использовании WPF не срабатывает свойство set{}.

Model

public class Layer
    {
        private string _nameLayer;
        public string NameLayer
        {
            get { return _nameLayer; }
            set { _nameLayer = value; }
        }
        private bool _showLayer;
        public bool ShowLayer
        {
            get { return _showLayer; }
            set { _showLayer = value; }
        }
        private string _colorLayer;
        public string ColorLayer { get; set; }
    }

Есть ViewModel класс MainViewModel реализующий свойство

    public Class MainViewModel:INotifyPropertyChanged   
    public event PropertyChangedEventHandler PropertyChanged;
                    protected virtual void OnPropertyChanged(string propertyName)
                    {
                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
                    }
public MainViewModel
{        
//в конструкторе получаем ObservableCollection<Layer> и передаем в свойство LayersCollection
}
        private ObservableCollection<Layer> _layersCollection;
        public ObservableCollection<Layer> LayersCollection
            {
                get
                {
                    return _layersCollection ?? (_layersCollection = new ObservableCollection<Layer>());
                }
                set
                {
                    _layersCollection = value;
                    OnPropertyChanged("LayersCollection");
                }
            }
    }

И View (xaml)

<UserControl.Resources>
    <mainViewModel:MainViewModel x:Key="Vm" />
</UserControl.Resources>
<Grid DataContext="{Binding Source={StaticResource Vm}}">
    <DataGrid
        Name="Layers"
        AutoGenerateColumns="False"
        CanUserResizeRows="False"
        HorizontalGridLinesBrush="#FFE4DDDD"
        ItemsSource="{Binding Path=LayersCollection, UpdateSourceTrigger=PropertyChanged}"
        VerticalGridLinesBrush="#00000000">
        <DataGrid.Columns>
            <DataGridTextColumn
                Width="*"
                Binding="{Binding NameLayer}"
                Header="Название слоя" />
            <DataGridCheckBoxColumn
                Width="auto"
                Binding="{Binding ShowLayer}"
                Header="Видимость" />
                </DataGridTemplateColumn.CellTemplate>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

При изменении во View коллекции свойство set{} не срабатывает, как решить проблему уже пробовал Model=TwoWay И UpdateSourceTrigger=PropertyChanged, но изменения не приходят в сеттер.

Answer 1

UpdateSourceTrigger и Mode нужно ставить в байнде выводимых свойств: NameLayer и ShowLayer.

Так же не помешало бы реализовать для вашего класса Layer интерфейс INotifyPropertyChanged, чтобы при изменении этих свойств они изменялись и в View. Ну и ObservableCollection поменять на BindingList.

READ ALSO
WPF как очистить Source у Image Control

WPF как очистить Source у Image Control

Мне нужно загружать картинку из бд и отображать ее на екране в контроле Image, после чего в определенном моменте мне нужно очищать Source тоесть...

466
Wpf CefSharp медленная работа сайта

Wpf CefSharp медленная работа сайта

Загружаю сайт (html5 js css) локально, сайт грузится, но работает с тормозами, подскажите, в чем проблема?

258
Считается ли ошибкой использования Socket-ов для соединения веб-приложения MVC и клиентского десктопного приложения в проекте ASP.NET Core?

Считается ли ошибкой использования Socket-ов для соединения веб-приложения MVC и клиентского десктопного приложения в проекте ASP.NET Core?

Считается ли ошибкой использования Socket-ов для соединения веб-приложения MVC и клиентского десктопного приложения в проекте ASPNET Core?

273
Идиомы программирования на C# [требует правки]

Идиомы программирования на C# [требует правки]

В любом языке программирования существуют устойчивые конструкции проверенные временем, которые можно применять не боясь, что это будет...

306