Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46

Редактирование xml

05.12.2018, 14:05. Показов 4686. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет

есть три таблицы
допустим stores, ballast, dc
stores и ballast это одинаковые таблицы но разных категорий
в них есть столбцы name, weight, sg, volume
таблица dc изначально пустая но заполняется при изменении значения weight в таблицах stores и ballast
её колонки: name, weight, x, y, z
x, y, z в свою очередь координаты для каждого weight которые уже есть
xml у меня три, для каждого datagrid

код MainWindow
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Window x:Class="wpfdcxml2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpfdcxml2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TabControl Name="storesballast" Grid.Row="0" Margin="-1,-1,1,1">
            <TabControl.Resources>
                <XmlDataProvider x:Key="storesdata" Source="stores.xml" XPath="stores"/>
                <XmlDataProvider x:Key="ballastdata" Source="ballast.xml" XPath="ballast"/>
            </TabControl.Resources>
            <TabItem Name="stores" Width="100" Height="50" Header="stores">
                <DataGrid x:Name=[B]"storesgrid"[/B] DataContext="{StaticResource storesdata}" ItemsSource="{Binding XPath=tank}"
                          AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Name" Binding="{Binding XPath=@name}"/>
                        <DataGridTextColumn Header="Weight" Binding="{Binding XPath=@weight}"/>
                        <DataGridTextColumn Header="sg" Binding="{Binding XPath=@sg}"/>
                        <DataGridTextColumn Header="volume" Binding="{Binding XPath=@volume}"/>
                    </DataGrid.Columns>
                </DataGrid>
            </TabItem>
            <TabItem Name="ballast" Width="100" Height="50" Header="ballast">
                <DataGrid x:Name=[B]"ballastgrid"[/B] DataContext="{StaticResource ballastdata}" ItemsSource="{Binding XPath=tank}"
                          AutoGenerateColumns="False">
                    <DataGrid.Columns>
                    <DataGridTextColumn Header="Name" Binding="{Binding XPath=@name}"/>
                    <DataGridTextColumn Header="Weight" Binding="{Binding XPath=@weight}"/>
                    <DataGridTextColumn Header="sg" Binding="{Binding XPath=@sg}"/>
                    <DataGridTextColumn Header="volume" Binding="{Binding XPath=@volume}"/>
                    </DataGrid.Columns>
                </DataGrid>
            </TabItem>
        </TabControl>
        <DataGrid Name=[B]"dc"[/B] Grid.Row="1" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Name">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox x:Name="keyCellTextbox" Text="{Binding Path=Element[name].Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="weight">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox x:Name="keyCellTextbox" Text="{Binding Path=Element[p].Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="sg">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox x:Name="keyCellTextbox" Text="{Binding Path=Element[sg].Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Volume">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox x:Name="keyCellTextbox" Text="{Binding Path=Element[volume].Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
тут таблицы stores и ballast представлены только в xaml
а таблица dc:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public partial class MainWindow : Window
    {
        private string _xmlPath = @"dcdata.xml";
        private XDocument _xDocument;
 
 
        public MainWindow()
        {
            InitializeComponent();
            BindXmlToDataGrid();
 
        }
        private void BindXmlToDataGrid()
        {
            _xDocument = XDocument.Load(_xmlPath);
            var items = from tank in _xDocument.Root.Elements("tank") select tank;
 
            this.dcgrid.ItemsSource = items;
 
        }
       
    }
вопросы
какой из способов лучше для моей задачи?
если есть, то какой способ ещё лучше из тех, что я не предложил, кроме тех, где xml надо вызывать через путь в компьютере.
как собственно реализовать:
при изменении значения weight в stores/ballast добавление строки в dc с заполнением weight и name, а так же заполнением x,y,z для значения weight
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.12.2018, 14:05
Ответы с готовыми решениями:

Редактирование XML-datagrid в WPF и паттерн MVVM
Добрый день, извините сразу, перелазил 720 страниц различной инфы не нашел, суть вопроса как работать с XML файлами, редактирование,...

Редактирование XML
Здравствуйте! Допустим имеется xml файл: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt; &lt;rssChannels&gt; &lt;channel id=&quot;0&quot;&gt; ...

XML редактирование.
В общем имеется код: using System; using System.Runtime.InteropServices; using System.Text.RegularExpressions; class...

43
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.12.2018, 11:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Shane_ Посмотреть сообщение
поправьте если не прав, но разве я этой строкой не меняю значение в xml файле?
если меняю, то как можно отфильтровать?
Почитал я за XmlDataProvider... Насколько понял он не сохраняет данные в XML. От только прочитать их оттуда может.
У Вас получается редактировать XML-файл используя XmlDataProvider ?
0
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
06.12.2018, 14:11  [ТС]
Элд Хасп, видимо не редактирует
так как файл остаётся таким же на всех этапах
просто видимо при Binding Mode=TwoWay изменения отображаются на всех ячёйках подключённых к xml
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.12.2018, 15:22
Цитата Сообщение от Shane_ Посмотреть сообщение
видимо не редактирует
так как файл остаётся таким же на всех этапах
просто видимо при Binding Mode=TwoWay изменения отображаются на всех ячёйках подключённых к xml
DataGrat или TextBox не знают же что за источник к ним подключён. XmlDataProvider создаёт представление XML файла в памяти, и элемент, возможно, редактирует значения в памяти.

Я чуть позже, скину Вам простую реализацию по посту #19.
1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
06.12.2018, 15:40  [ТС]
Элд Хасп, спасибо
я параллельно продолжу искать
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.12.2018, 19:37
Сделал простой пример
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<Window x:Class="Cs_WPF.EditXMLinDataGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Cs_WPF"
        mc:Ignorable="d"
        Title="EditXMLinDataGrid" Height="450" Width="800">
    <Window.Resources>
        <XmlDataProvider x:Key="storesdata" Source="stores.xml" XPath="tanks"/>
        <Style TargetType="DataGrid">
            <Setter Property="Margin" Value="10"/>
        </Style>
        <local:WinCommands x:Key="WinCommands"/>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid DataContext="{Binding Mode=OneWay, Source={StaticResource storesdata}}" ItemsSource="{Binding XPath=tank}"
                          AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="3*"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding XPath=Weight}" Width="*"/>
                <DataGridTextColumn Header="SG" Binding="{Binding XPath=SG}" Width="*"/>
                <DataGridTextColumn Header="Volume" Binding="{Binding XPath=Volume}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Grid.Column="1" DataContext="{Binding Mode=OneWay, Source={StaticResource storesdata}}" ItemsSource="{Binding XPath=tank}"
                          AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="3*"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding XPath=Weight}" Width="*"/>
                <DataGridTextColumn Header="SG" Binding="{Binding XPath=Sg}" Width="*"/>
                <DataGridTextColumn Header="volume" Binding="{Binding XPath=Volume}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button Grid.Column="1" Content="Сохранить" VerticalAlignment="Bottom" HorizontalAlignment="Center" Command="{Binding SaveCommand}" DataContext="{StaticResource WinCommands}" CommandParameter="{StaticResource storesdata}"/>
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
namespace Cs_WPF
{
    #region Класс команд - RelayCommand
    public class RelayCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        private readonly Func<object, bool> _canExecute;
        private readonly Action<object> _onExecute;
 
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _onExecute = execute;
            _canExecute = canExecute;
        }
 
        public bool CanExecute(object parameter)
        {
            if (_canExecute == null) return true;
            return _canExecute.Invoke(parameter);
        }
 
        public void Execute(object parameter)
        {
            _onExecute?.Invoke(parameter);
        }
    }
    #endregion
 
    #region Класс для биндинга команд
    public class WinCommands
    {
        static void OnSave(object value)
        {
            if (value is XmlDataProvider xmlDataProvider)
            {
                xmlDataProvider.Document.Save("dc.xml");
            }
        }
 
        public  ICommand SaveCommand { get; } = new RelayCommand(OnSave);
    }
    #endregion
}
Но не смог разобраться с XPath.
В строке
XML
30
        <DataGrid Grid.Column="1" DataContext="{Binding Mode=OneWay, Source={StaticResource storesdata}}" ItemsSource="{Binding XPath=tank}"
в XPath надо задать выражение фильтрующее элементы по значению Weight !=0. Я до этого не биндил напрямую XML данные. Сейчас почитал, делаю как в примерах - но не получается.
Надо кого-то попросить о помощи.

XML-файл stores.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<tanks>
  <Filter>
    <Weight>0.00</Weight>
  </Filter>
  <tank ID="1SFWSB">
    <Name>Side fresh water tank No.1 SB</Name>
    <Weight>0.00</Weight>
    <SG>1.000</SG>
    <Volume>0.00</Volume>
  </tank>
  <tank ID="1SFWPS">
    <Name>Side fresh water tank No.1 PS</Name>
    <Weight>0.00</Weight>
    <SG>1.000</SG>
    <Volume>0.00</Volume>
  </tank>
  <tank ID="2SFWPS">
    <Name>Side fresh water tank No.2 PS</Name>
    <Weight>0.00</Weight>
    <SG>1.000</SG>
    <Volume>0.00</Volume>
  </tank>
  <tank ID="2SFWSB">
    <Name>Side fresh water tank No.2 SB</Name>
    <Weight>0.00</Weight>
    <SG>1.000</SG>
    <Volume>0.00</Volume>
  </tank>
  <tank ID="1MDO">
    <Name>Marine diesel oil tank PS</Name>
    <Weight>0.00</Weight>
    <SG>0.800</SG>
    <Volume>0.00</Volume>
  </tank>
</tanks>
1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
06.12.2018, 20:12  [ТС]
Элд Хасп, спасибо
буду сейчас переписывать без кнопок
и пытаться указать if(weight !=0)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.12.2018, 20:14
Цитата Сообщение от Shane_ Посмотреть сообщение
буду сейчас переписывать без кнопок
и пытаться указать if(weight !=0)
Кнопка служит для сохранения отредактированных данных. Разобрались как работает?
0
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
06.12.2018, 20:35  [ТС]
Элд Хасп, вроде да
но мне нельзя задавать кнопки
я думаю, что все изменения должны будут хранится в памяти и после, из неё же записываться в pdf документ.
либо если не раелизуемо, то кнопку поменяю на действие нажатия ENTER и поставлю постоянную перезапись dc.xml
по поводу кстати записи в dc.xml
возможно лучше убрать фильтр из stores.xml
далее все изменения на storesdg записывать в dc.xml а затем проверять значения там и уже там отсеивать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.12.2018, 21:35
Получилось! Так и не понял почему. 30 раз перепробовал, в том числе и такой вариант - не работало. Хотел тему создать на форуме, код XAML для примера создавал - вдруг заработал. Что было не так жо этого так и не понял.
Вот полный XAML окна, может где в другом месте что изменил.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<Window x:Class="Cs_WPF.EditXMLinDataGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Cs_WPF"
        mc:Ignorable="d"
        Title="EditXMLinDataGrid" Height="450" Width="800">
    <Window.Resources>
        <XmlDataProvider x:Key="storesdata" Source="stores.xml" XPath="tanks"/>
        <Style TargetType="DataGrid">
            <Setter Property="Margin" Value="10"/>
        </Style>
        <local:WinCommands x:Key="WinCommands"/>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid DataContext="{Binding Mode=OneWay, Source={StaticResource storesdata}}" AutoGenerateColumns="False" ItemsSource="{Binding XPath=tank}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="3*"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding XPath=Weight}" Width="*"/>
                <DataGridTextColumn Header="SG" Binding="{Binding XPath=Sg}" Width="*"/>
                <DataGridTextColumn Header="volume" Binding="{Binding XPath=Volume}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Grid.Column="1" DataContext="{Binding Mode=OneWay, Source={StaticResource storesdata}}" AutoGenerateColumns="False" ItemsSource="{Binding XPath=tank[Weight\>\0]}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="3*"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding XPath=Weight}" Width="*"/>
                <DataGridTextColumn Header="SG" Binding="{Binding XPath=Sg}" Width="*"/>
                <DataGridTextColumn Header="volume" Binding="{Binding XPath=Volume}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button Grid.Column="1" Content="Сохранить" VerticalAlignment="Bottom" HorizontalAlignment="Center" 
                Command="{Binding SaveCommand}" DataContext="{StaticResource WinCommands}" 
                CommandParameter="{StaticResource storesdata}"/>
    </Grid>
</Window>
В левом DataGRid отображаются все элементы, в правом только те у которых Weight > 0
Кнопка сохраняет отредактированные данные.

Добавлено через 1 минуту
Цитата Сообщение от Shane_ Посмотреть сообщение
вроде да
но мне нельзя задавать кнопки
я думаю, что все изменения должны будут хранится в памяти и после, из неё же записываться в pdf документ.
либо если не раелизуемо, то кнопку поменяю на действие нажатия ENTER и поставлю постоянную перезапись dc.xml
по поводу кстати записи в dc.xml
возможно лучше убрать фильтр из stores.xml
далее все изменения на storesdg записывать в dc.xml а затем проверять значения там и уже там отсеивать?
Можно сохранять по закрытию окна. Или приложения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.12.2018, 12:58
Лучший ответ Сообщение было отмечено Shane_ как решение

Решение

Вот вариант с сохранением по закрытию окна
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<Window x:Class="Cs_WPF.EditXMLinDataGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Cs_WPF"
        mc:Ignorable="d" 
        Title="EditXMLinDataGrid" Height="450" Width="800" 
        DataContext="{DynamicResource ViewModel}" Closing="Window_Closing">
    <Window.Resources>
        <local:ViewModelXML x:Key="ViewModel">
            <local:ViewModelXML.storesdata>
                <XmlDataProvider  Source="stores.xml" XPath="tanks"/>
            </local:ViewModelXML.storesdata>
        </local:ViewModelXML>
        <Style TargetType="DataGrid">
            <Setter Property="Margin" Value="10"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid  AutoGenerateColumns="False" ItemsSource="{Binding XPath=tank}" DataContext="{Binding storesdata}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="3*"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding XPath=Weight}" Width="*"/>
                <DataGridTextColumn Header="SG" Binding="{Binding XPath=Sg}" Width="*"/>
                <DataGridTextColumn Header="volume" Binding="{Binding XPath=Volume}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Grid.Column="1"  ItemsSource="{Binding XPath=tank[Weight\>\0]}"
            AutoGenerateColumns="False" DataContext="{Binding storesdata}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="3*"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding XPath=Weight}" Width="*"/>
                <DataGridTextColumn Header="SG" Binding="{Binding XPath=Sg}" Width="*"/>
                <DataGridTextColumn Header="volume" Binding="{Binding XPath=Volume}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
CB окна
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    public partial class EditXMLinDataGrid : Window
    {
        public EditXMLinDataGrid()
        {
            InitializeComponent();
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            switch(MessageBox.Show("Сохранить данные?", "Закрытие окна", MessageBoxButton.YesNoCancel))
            {
                case MessageBoxResult.Cancel:
                    {
                        e.Cancel = true;
                        break;
                    }
                case MessageBoxResult.Yes:
                    {
                        ViewModelXML viewModelXML =(ViewModelXML) DataContext;
                        ViewModelXML.OnSave(viewModelXML.storesdata);
                        break;
                    }
            }
        }
    }
ViewModel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    #region Класс ViewModel
    public class ViewModelXML
    {
      public  static void OnSave(object value)
        {
            if (value is XmlDataProvider xmlDataProvider)
            {
                xmlDataProvider.Document.Save("dc.xml");
            }
        }
 
        public XmlDataProvider storesdata { get; set; }
 
    }
    #endregion
1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
07.12.2018, 16:29  [ТС]
Элд Хасп, да спасибо
в конечном итоге просто переведу действие на более позднюю точку
а ещё спросить пару моментов можно?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.12.2018, 16:43
Цитата Сообщение от Shane_ Посмотреть сообщение
в конечном итоге просто переведу действие на более позднюю точку
а ещё спросить пару моментов можно?
Пишите

Добавлено через 1 минуту
Цитата Сообщение от Shane_ Посмотреть сообщение
в конечном итоге просто переведу действие на более позднюю точку
Вы имеете ввиду взять начальные данные из более позднего сохранения?
0
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
07.12.2018, 17:03  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы имеете ввиду взять начальные данные из более позднего сохранения?
почти, будет возможность сохранять "случаи" загрузки <tanks/>
и потом их подгружать
вопрос в другом
тоже облазил много
как можно задать математическую функцию?
в данном случае
weight = volume * sg
volume = weight / sg
причём сохранить возможность ввода юзером обоих значений.
пример
есть танк номер пять в stores.xml
XML
1
2
3
4
5
6
<tank ID="1MDO">
    <Name>Marine diesel oil tank PS</Name>
    <Weight>0.00</Weight>
    <SG>0.800</SG>
    <Volume>0.00</Volume>
  </tank>
если пользователь вводит в колонку weight значение 100 то в колонке volume появляется 80 так как sg = 0.800
и наоборот если пользователь вводит в колонку volume значение 80 то в колонке weight появляется 100
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.12.2018, 17:09
Цитата Сообщение от Shane_ Посмотреть сообщение
если пользователь вводит в колонку weight значение 100 то в колонке volume появляется 80 так как sg = 0.800
и наоборот если пользователь вводит в колонку volume значение 80 то в колонке weight появляется 100
А sg может меняться?
0
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
07.12.2018, 17:13  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А sg может меняться?
да
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.12.2018, 17:16
Цитата Сообщение от Shane_ Посмотреть сообщение
почти, будет возможность сохранять "случаи" загрузки <tanks/>
и потом их подгружать
Если нужно сохранять историю, можно в tank ввести дополнительные элементы и хранить там. Типа
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<tank ID="1MDO">
    <Name>Marine diesel oil tank PS</Name>
    <Weight>0.00</Weight>
    <SG>0.800</SG>
    <Volume>0.00</Volume>
  <History>
       <Day Date="15.07.1017">
            <Weight>1.00</Weight>
            <SG>0.800</SG>
            <Volume>0.00</Volume>
       </Day>
       <Day Date="25.01.1018">
            <Weight>0.00</Weight>
            <SG>0.800</SG>
            <Volume>1.00</Volume>
       </Day>
  </History>
  </tank>
Добавлено через 1 минуту
Цитата Сообщение от Shane_ Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А sg может меняться?
да
А если sg меняется, то какие должны быть значения у weight и volume ?
0
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
07.12.2018, 17:30  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если нужно сохранять историю, можно в tank ввести дополнительные элементы и хранить там
хорошая мысль
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А если sg меняется, то какие должны быть значения у weight и volume ?
при смене значения sg, значение weight остаётся прежним, а volume меняется относительно нового sg
при sg=0.8 и weight=100: volume = 125
а при sg=0.5 и weight=100: volume = 200
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.12.2018, 17:35
Цитата Сообщение от Shane_ Посмотреть сообщение
при смене значения sg, значение weight остаётся прежним, а volume меняется относительно нового sg
при sg=0.8 и weight=100: volume = 125
а при sg=0.5 и weight=100: volume = 200
Это сложная логика для WPF связанного только с XML. Сразу сказать не могу. Надо попробовать конвертеры. Поэкспериментировать.

Добавлено через 35 секунд
Может Вам на нормальный MVVM перейти?
0
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 46
07.12.2018, 17:39  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может Вам на нормальный MVVM перейти?
я тоже уже думаю что это единственный выход
но mvvm для меня очень глубокая степь
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.12.2018, 17:43
Цитата Сообщение от Shane_ Посмотреть сообщение
я тоже уже думаю что это единственный выход
но mvvm для меня очень глубокая степь
Да, там конечно сложнее чем просто привязка XML к WPF. Но сложность это обратная сторона гибкости.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.12.2018, 17:43

Редактирование XML файла
Помогите пожалуйста разобраться. Eсть xml документ: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;IPNetDescList&gt; ...

XML добавление и редактирование
Доброго времени. У меня возникла проблема. Сегодня впервые решил познакомиться с XML и начать с ним работать. По учебнику и интернету я...

Чтение XML файла, без использования встроенных средств работы с XML
Разработать программу на любом из перечисленных языков программирования c#. Программа должна читать XML-файл. Разбирать элементы не...

LINQ to XML или XPath to XML (выбор одного элемента)
Прошу помощи в LINQ или XPath запросе к XML Вот XML: &lt;manifest...

Пропарсить и стандартизировать XML, XSL или Linq to XML?
Такой вопрос. необходимо считывать XML-файлы и приводить их к единому стандарту руководствуясь положением элементов в иерархии и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru