C# wpf проблема с привязкой бд к панели

Рейтинг: 0Ответов: 0Опубликовано: 01.06.2023

Я создал и привязал коллекцию ImageSources при добавление у меня отображаются изображения, сохраняю как в кеш бд, так и на сервер без проблем так серелизую в json коллекцию, вопрос в том как лучше сделать редактирование публикации, то есть её вложенный изображений.

Так как при удаление изображения из ImageSources, я больше не имею доступа к этим данным, лучше сделать отдельную коллекцию, для хранения id этих изображений до того времени пока изменения не будут сохранены? Обработать события редактирования сразу не могу для бд или отправки на сервер, так как у меня есть две кнопки: Сохранить и Сохранить изменения то есть все данные сохраняются только после создания или редактирования публикации.

Код для отображения изображений на форме

<ItemsControl x:Name="imageItemsControl" Grid.Row="13" Grid.RowSpan="6" Height="65"  Grid.Column="2" Margin="5,0,31,20"
              ItemsSource="{Binding Path=ImageSources}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Image x:Name="ImageAttachment" Source="{Binding Image, Converter={StaticResource ByteArrayToImageConverter}}" Margin="0,0,5,0" Width="55" Height="55" Stretch="UniformToFill" MouseUp="ImageAttachment_MouseUp"/>
                            <Button x:Name="DeleteImage" Background="#EF1212" BorderBrush="Transparent" HorizontalAlignment="Right"
                            VerticalAlignment="Top" Width="15" Height="15" Padding="1" Margin="0, 5, 5, 0"
                            Style="{DynamicResource ButtonStyleRemoveImage}" FontSize="8" Foreground="White" Click="DeleteImage_Click">X</Button>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

Привязанная коллекция

ObservableCollection<ImagePostingDB> ImageSources = new();

Модель для работы с данными

 public class ImagePostingDB
    {
        [Key]
        public long? Id { get; set; }
        /// <summary>
        /// Изображение в байтах
        /// </summary>
        public byte[]? Image { get; set; }
        public bool Delete { get; set; } = false;
        public bool Add { get; set; } = false;
        [JsonIgnore]
        public long? AutoPostingDBId { get; set; }
        [JsonIgnore]
        public AutoPostingDB? AutoPostingDB { get; set; }
    }

Так добавляю изображение

 private void BtnSelectImage_Click(object sender, RoutedEventArgs e)
        {
            if (ImageSources.Count > 4)
            {
                MessageBox.Show("Нельзя добавить больше изображений");
                return;
            }
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == true)
            {
                string imagePath = openFileDialog.FileName;
                byte[] imageBytes = File.ReadAllBytes(imagePath);
                ImagePostingDB newImage = new ImagePostingDB
                {
                    Id = null,
                    Image = imageBytes,
                    Add = true
                };
                var publish = ListBoxPosting.SelectedItem as AutoPostingDB;
                if (publish != null)
                {
                    using DataContext db = new DataContext();
                    var autoPosting = db.AutoPostingDB.Include(x => x.ImagePostingDB).FirstOrDefault(x => x.Id == publish.Id);
                    newImage.AutoPostingDB = autoPosting;
                }
                ImageSources.Add(newImage);
            }
        }

А так удаляю

 private void DeleteImage_Click(object sender, RoutedEventArgs e)
        {
            Button button = (Button)sender;
            Grid grid = (Grid)button.Parent;
            var image = (ImagePostingDB)grid.DataContext;
            ImageSources.Remove(image);
        }

А так сохраняю

 /// <summary>
        /// Сохраненение публикации
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void BtnSavePosting_Click(object sender, RoutedEventArgs e)
        {
            var data = GetData();
            if (data.Return)
                return;
            using DataContext db = new DataContext();
            AutoPostingDB autoPosting = new()
            {
                UserSoft = db.UserSoft.FirstOrDefault(),
                Message = TbTextPosting.Text,
                Publish = new DateTime(data.year, data.month, data.day, data.hours, data.minutes, 0)
            };
            await db.AutoPostingDB.AddRangeAsync(autoPosting);
            foreach (var res in ListBoxChatsPosting.Items)
            {
                var chat = res as ListPublishChat;
                if (chat != null)
                {
                    ListPublishChat listPublishChat = new()
                    {
                        AutoPostingDB = autoPosting,
                        ChatId = chat.ChatId,
                        Name = chat.Name,
                        PublishCheck = chat.PublishCheck
                    };
                    autoPosting.ListPublishChat.Add(listPublishChat);
                    await db.ListPublishChat.AddRangeAsync(listPublishChat);
                }
            }
            if (ImageSources.Count > 0)
            {
                foreach (var element in ImageSources)
                {
                    var tempImage = new ImagePostingDB()
                    {
                        Image = element.Image,
                        AutoPostingDB = autoPosting
                    };
                    autoPosting.ImagePostingDB.Add(tempImage);
                    await db.ImagePostingDB.AddRangeAsync(tempImage);
                    lock (this)
                        db.SaveChanges();
                    ///Присваиваю ID к элементам колекции ImageSources после того как сохранил в бд изображение
                    ///Другого способа не вижу чтобы это реализовать
                    element.Id = db.ImagePostingDB.ToList().Last().Id;
                    element.Add = false;
                }
                var publishDB = await SavePublish(autoPosting);
                if (!publishDB)
                {
                    MessageBox.Show("Не удалось сохранить публикацию");
                    return;
                }
            }
            lock (this)
                db.SaveChanges();
            var autoPostingID = db.AutoPostingDB.ToList().Last().Id;
            autoPosting.Id = autoPostingID;
            AutoPostings.Add(autoPosting);
        }
        /// <summary>
        /// Сохранить публикацию на сервере
        /// </summary>
        /// <param name="autoPostingDB"></param>
        /// <returns></returns>
        async Task<bool> SavePublish(AutoPostingDB autoPostingDB)
        {
            using var client = new HttpClient();
            string json = JsonPublish(autoPostingDB);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var response = await client.PostAsync("https://localhost:5001/SavePublish", content);
            if (!response.IsSuccessStatusCode)
            {
                MessageBox.Show($"Не удалось сохранить публикацию");
                return false;
            }
            return true;
        }

А так сохраняю изменения код этого места не полностью готовый, не судите строго)

 /// <summary>
        /// Сохранение изменений публикации
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void BtnEditPosting_Click(object sender, RoutedEventArgs e)
        {
            using DataContext db = new DataContext();
            var data = GetData();
            if (data.Return)
                return;
            var publish = ListBoxPosting.SelectedItem as AutoPostingDB;
            if (publish != null)
            {
                var autoPosting = db.AutoPostingDB.Include(x => x.ImagePostingDB).Include(x => x.ListPublishChat).Include(x => x.UserSoft).FirstOrDefault(x => x.Id == publish.Id);
                if (autoPosting != null)
                {
                    autoPosting.Message = TbTextPosting.Text;
                    autoPosting.Publish = new DateTime(data.year, data.month, data.day, data.hours, data.minutes, 0);
                    if (autoPosting.Publish >= DateTime.Now)
                    {
                        autoPosting.TbStatusPublish = "Не опубликовано";
                        publish.TbStatusPublish = "Не опубликовано";
                    }
                    publish.Message = TbTextPosting.Text;
                    publish.Publish = new DateTime(data.year, data.month, data.day, data.hours, data.minutes, 0);
                }
                EditImage(db, autoPosting);
                var editPublish = await EditPublish(autoPosting);
                lock (this)
                    db.SaveChanges();
                ListBoxPosting.Items.Refresh();
            }
        }
        void EditImage(DataContext db, AutoPostingDB autoPosting)
        {
            foreach (var iteam in ImageSources)
            {
                if (iteam.Delete)
                {
                    var del = db.ImagePostingDB.FirstOrDefault(x => x.Id == iteam.Id);
                    if (del != null)
                    {
                        autoPosting.ImagePostingDB.Remove(del);
                        continue;
                    }
                }
                if (iteam.Add)
                {
                    var tempImage = new ImagePostingDB()
                    {
                        Image = iteam.Image,
                        AutoPostingDB = autoPosting
                    };
                    autoPosting.ImagePostingDB.Add(tempImage);
                }
            }
        }
        /// <summary>
        /// Сохранить изменения публикации на сервере
        /// </summary>
        /// <param name="autoPostingDB"></param>
        /// <returns></returns>
        async Task<bool> EditPublish(AutoPostingDB autoPostingDB)
        {
            autoPostingDB.ImagePostingDB = ImageSources.ToList();
            using var client = new HttpClient();
            string json = JsonPublish(autoPostingDB);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var response = await client.PostAsync("https://localhost:5001/EditPublish", content);
            if (!response.IsSuccessStatusCode)
            {
                MessageBox.Show($"Не удалось сохранить публикацию");
                return false;
            }
            return true;
        }

Ответы

Ответов пока нет.