1

У меня есть xml файл

 <ballast>
  <tank number="32" ID="FPTW" Name="Forepeak" Weight="0,00" SG="1,025" Volume="0,00">
    <volume level="0.00" x="52.00" y="-0.90" z="0.00">0.00</volume>
    <volume level="0.10" x="53.48" y="0.00" z="0.05">0.77</volume>
    <volume level="0,20" x="53,70" y="0,00" z="0,11">1,99</volume>
    <volume level="0,30" x="53,88" y="0,00" z="0,18">3,61</volume>
    <volume level="0,40" x="54,02" y="0,00" z="0,24">5,54</volume>
    <volume level="0,50" x="54,16" y="0,00" z="0,30">7,80</volume>
    <volume level="0,60" x="54,29" y="0,00" z="0,36">10,36</volume>
    <volume level="0,70" x="54,39" y="0,00" z="0,42">13,12</volume>
  </tank>
</ballast>

Есть модель

public class Model
{
    public static string Path = "XMLFile1.xml";
}
[Serializable]
public class ModelBallast
{
    public int Number { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
    public double Weight { get; set; }
    public double Sg { get; set; }
    public double Volume { get; set; }
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }
}

Есть vm но в ней только INotifyPropertyChanged

class BallastVM : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Есть view

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TabControl>
        <TabItem Header="Ballast" Height="40" Width="100">
            <DataGrid x:Name="ballastdg" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Name" Width="3*"/>
                    <DataGridTextColumn Header="Weight" Width="*"/>
                    <DataGridTextColumn Header="SG" Width="*"/>
                    <DataGridTextColumn Header="Volume" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>
        </TabItem>
    </TabControl>
    <DataGrid Grid.Row="1" x:Name="dcdg" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Width="3*" />
            <DataGridTextColumn Header="Volume" Width="*"/>
            <DataGridTextColumn Header="X" Width="*"/>
            <DataGridTextColumn Header="Y" Width="*"/>
            <DataGridTextColumn Header="Z" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

И мне надо

  1. Binding xml на ballastdg
  2. Разрешить юзеру редактировать всё кроме имени с влиянием на другие элементы (weight = sg * volume)
  3. При volume !=0 показать строку в dcdg с тем показателем volume и соответствующим ему координатам
EvgeniyZ
  • 15,694
  • Если у вас все по MVVM, то в Model у вас должен быть некий метод, который будет возвращать данные, либо запускать процесс их получения и передавать их с помощью события. В VM у вас должна быть коллекция, которая привязывается к View элементам и метод, который будет из модели забирать данные, заполняя необходимую коллекцию. По поводу пункта 2 - тут в set свойства VM добавьте необходимую логику по подсчету и изменения другого свойства. Пункт 3 не понял немного... – EvgeniyZ Jan 08 '19 at 11:25
  • Изначально xml биндится в первую дг и у него стартовое значение 0. Если значение поменялось, то строка появляется во второй дг с именем, изменённым значением, и координатами которые относятся к этому значению volume.
  • – Lee Shane Jan 08 '19 at 11:38
  • Ну тогда 3-й пункт можно сделать таким способом. – EvgeniyZ Jan 08 '19 at 11:50
  • а можно какой-то пример по вашим подсказкам? – Lee Shane Jan 08 '19 at 12:18
  • а насчёт третьего можно фильтром попробовать но мне надо добавить интерполяцию, то-есть если ввели 11, то программа находит ближайшие значения(10,36 и 13,12) и даёт результат – Lee Shane Jan 08 '19 at 12:26