feat: 필터 탭 변경 시 DataGrid 변경

hhsung_work
HyungJune Kim 10 months ago
parent 92800c3171
commit 11bbf7922f

@ -13,6 +13,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
using static SmartAquaViewer.Model.Enums;
namespace SmartAquaViewer.Controls namespace SmartAquaViewer.Controls
{ {
@ -36,11 +37,21 @@ namespace SmartAquaViewer.Controls
DependencyProperty.Register(nameof(SelectedValue), typeof(string), typeof(SegmentedControl), DependencyProperty.Register(nameof(SelectedValue), typeof(string), typeof(SegmentedControl),
new PropertyMetadata(null)); new PropertyMetadata(null));
public MonitorTab SelectedTab
{
get { return (MonitorTab)GetValue(SelectedTabProperty); }
set { SetValue(SelectedTabProperty, value); }
}
public static readonly DependencyProperty SelectedTabProperty =
DependencyProperty.Register(nameof(SelectedTab), typeof(MonitorTab), typeof(SegmentedControl),
new PropertyMetadata(null));
private void RadioButton_Checked(object sender, RoutedEventArgs e) private void RadioButton_Checked(object sender, RoutedEventArgs e)
{ {
if (sender is RadioButton rb && rb.Tag != null) if (sender is RadioButton rb && rb.Tag != null)
{ {
SelectedValue = rb.Tag.ToString(); SelectedTab = (MonitorTab)Enum.Parse(typeof(MonitorTab), rb.Tag.ToString());
} }
} }
} }

@ -6,13 +6,13 @@ using System.Threading.Tasks;
namespace SmartAquaViewer.Model namespace SmartAquaViewer.Model
{ {
class Enums public class Enums
{ {
public enum PanelState public enum MonitorTab
{ {
Hidden, Tank,
Normal, Filter,
Expanded Sterilizer
} }
} }
} }

@ -1,6 +1,9 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:helper="clr-namespace:SmartAquaViewer.Helper"> xmlns:helper="clr-namespace:SmartAquaViewer.Helper"
xmlns:vm="clr-namespace:SmartAquaViewer.ViewModel"
xmlns:model="clr-namespace:SmartAquaViewer.Model"
xmlns:da="clr-namespace:SmartAquaViewer.DataAnalysis">
<FontFamily x:Key="SCDream1">pack://application:,,,/Fonts/#S-Core Dream 1 Thin</FontFamily> <FontFamily x:Key="SCDream1">pack://application:,,,/Fonts/#S-Core Dream 1 Thin</FontFamily>
<FontFamily x:Key="SCDream2">pack://application:,,,/Fonts/#S-Core Dream 2 ExtraLight</FontFamily> <FontFamily x:Key="SCDream2">pack://application:,,,/Fonts/#S-Core Dream 2 ExtraLight</FontFamily>
@ -104,4 +107,14 @@
<Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style> </Style>
<Style x:Key="DataGridStyle" TargetType="DataGrid">
<Setter Property="EnableRowVirtualization" Value="True"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="HeadersVisibility" Value="Column"/>
<Setter Property="AutoGenerateColumns" Value="False"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="CanUserAddRows" Value="False"/>
</Style>
</ResourceDictionary> </ResourceDictionary>

@ -21,12 +21,12 @@
<ImageBrush ImageSource="/Resources/Images/top_bg.png" Stretch="Fill"/> <ImageBrush ImageSource="/Resources/Images/top_bg.png" Stretch="Fill"/>
</Grid.Background> </Grid.Background>
<control:SegmentedControl x:Name="segmentedControl" Margin="20 10" <control:SegmentedControl x:Name="segmentedControl" Margin="20 10"
SelectedValue="{Binding CurrentSystem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> SelectedTab="{Binding SelectedTab, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid> </Grid>
<ScrollViewer Grid.Row="1" Margin="20 20 20 40" <ScrollViewer x:Name="svTanks" Grid.Row="1" Margin="20 20 20 40"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalAlignment="Center"> HorizontalAlignment="Center" Visibility="Collapsed">
<ItemsControl ItemsSource="{Binding TankGroups}"> <ItemsControl ItemsSource="{Binding TankGroups}">
<ItemsControl.ItemsPanel> <ItemsControl.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
@ -44,11 +44,7 @@
<!-- Value(= ObservableCollection<WaterQualityVO>)로 DataGrid --> <!-- Value(= ObservableCollection<WaterQualityVO>)로 DataGrid -->
<DataGrid ItemsSource="{Binding Value}" <DataGrid ItemsSource="{Binding Value}"
AutoGenerateColumns="False" Style="{StaticResource DataGridStyle}">
CanUserAddRows="False"
IsReadOnly="True"
HeadersVisibility="Column"
IsHitTestVisible="True">
<DataGrid.Columns> <DataGrid.Columns>
<!-- 측정 시각 --> <!-- 측정 시각 -->
@ -58,7 +54,7 @@
<!-- Tank 값들 --> <!-- Tank 값들 -->
<DataGridTextColumn Header="수조" Binding="{Binding Tank.Number}"/> <DataGridTextColumn Header="수조" Binding="{Binding Tank.Number}"/>
<DataGridTextColumn Header="DO" Binding="{Binding Tank.DO, StringFormat=\{0:F2\}}"/> <DataGridTextColumn Header="DO" Binding="{Binding Tank.DOValue, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="pH" Binding="{Binding Tank.PH, StringFormat=\{0:F2\}}"/> <DataGridTextColumn Header="pH" Binding="{Binding Tank.PH, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="ORP" Binding="{Binding Tank.ORP, StringFormat=\{0:F0\}}"/> <DataGridTextColumn Header="ORP" Binding="{Binding Tank.ORP, StringFormat=\{0:F0\}}"/>
<DataGridTextColumn Header="온도(℃)" Binding="{Binding Tank.Temperature, StringFormat=\{0:F1\}}"/> <DataGridTextColumn Header="온도(℃)" Binding="{Binding Tank.Temperature, StringFormat=\{0:F1\}}"/>
@ -71,6 +67,50 @@
</ItemsControl> </ItemsControl>
</ScrollViewer> </ScrollViewer>
<ScrollViewer x:Name="svFilter" Grid.Row="1" Margin="20 20 20 40"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalAlignment="Center" Visibility="Collapsed">
<DataGrid ItemsSource="{Binding WaterQualityList}" Style="{StaticResource DataGridStyle}">
<DataGrid.Columns>
<DataGridTextColumn
Header="시간"
Binding="{Binding RecordedTime, StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}"/>
<DataGridTextColumn Header="모래여과기 전원" Binding="{Binding Filtering.SandFilterPower}"/>
<DataGridTextColumn Header="섬프탱크 pH" Binding="{Binding Filtering.SumpPH}"/>
<DataGridTextColumn Header="섬프탱크 ORP(mV)" Binding="{Binding Filtering.SumpORP, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="섬프탱크 수위(m)" Binding="{Binding Filtering.SumpWaterLevel, StringFormat=\{0:F0\}}"/>
<DataGridTextColumn Header="섬프탱크 유량(m³/s)" Binding="{Binding Filtering.SumpFlowRate, StringFormat=\{0:F1\}}"/>
<DataGridTextColumn Header="섬프탱크 수온(°C)" Binding="{Binding Filtering.SumpTemperature, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="섬프탱크 전원" Binding="{Binding Filtering.CirculationPumpPower}"/>
<DataGridTextColumn Header="인버터 제어기 상태" Binding="{Binding Filtering.InverterControllerStatus}"/>
<DataGridTextColumn Header="순환펌프 유량(m³/s)" Binding="{Binding Filtering.FlowRate, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="히트펌프 전원" Binding="{Binding Filtering.HeatPumpPower}"/>
<DataGridTextColumn Header="히트펌프 온도(°C)" Binding="{Binding Filtering.HeatPumpTemperature, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="에어브로와 전원" Binding="{Binding Filtering.AirBlowerPower}"/>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
<ScrollViewer x:Name="svSterilizer" Grid.Row="1" Margin="20 20 20 40"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalAlignment="Center">
<DataGrid ItemsSource="{Binding WaterQualityList}" Style="{StaticResource DataGridStyle}">
<DataGrid.Columns>
<DataGridTextColumn
Header="시간"
Binding="{Binding RecordedTime, StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}"/>
<DataGridTextColumn Header="오존 발생기 전원" Binding="{Binding Sterilizing.OzoneGeneratorPower}"/>
<DataGridTextColumn Header="자외선 살균기 ID" Binding="{Binding Sterilizing.UVSterilizerId}"/>
<DataGridTextColumn Header="자외선 살균기 전원" Binding="{Binding Sterilizing.UVSterilizerPower}"/>
<DataGridTextColumn Header="오존용해장치 전원" Binding="{Binding Sterilizing.OzoneDissolverPower}"/>
<DataGridTextColumn Header="오존용해장치 압력(kPa)" Binding="{Binding Sterilizing.OzoneDissolverPressure, StringFormat=\{0:F1\}}"/>
<DataGridTextColumn Header="배오존장치 전원" Binding="{Binding Sterilizing.ExcessOzoneDestroyerPower}"/>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
<Grid Grid.Row="1" VerticalAlignment="Bottom"> <Grid Grid.Row="1" VerticalAlignment="Bottom">
<Button Name="btnVisibilityDown" Tag="down" <Button Name="btnVisibilityDown" Tag="down"
Style="{StaticResource ImageButtonStyle}" Height="33" Command="{Binding ChangeDrawerStatusCommand}" Style="{StaticResource ImageButtonStyle}" Height="33" Command="{Binding ChangeDrawerStatusCommand}"

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -28,60 +29,45 @@ namespace SmartAquaViewer.View
{ {
private MonitoringViewModel? monitoringViewModel; private MonitoringViewModel? monitoringViewModel;
private readonly Dictionary<MonitorTab, ScrollViewer> _tabMap;
public MonitoringView() public MonitoringView()
{ {
InitializeComponent(); InitializeComponent();
_tabMap = new Dictionary<MonitorTab, ScrollViewer>
{
{ MonitorTab.Tank, svTanks },
{ MonitorTab.Filter, svFilter },
{ MonitorTab.Sterilizer, svSterilizer }
};
Loaded += MonitoringView_Loaded; Loaded += MonitoringView_Loaded;
} }
private void MonitoringView_Loaded(object sender, RoutedEventArgs e) private void MonitoringView_Loaded(object sender, RoutedEventArgs e)
{ {
monitoringViewModel = this.DataContext as MonitoringViewModel; monitoringViewModel = this.DataContext as MonitoringViewModel;
monitoringViewModel.OnSystemChanged += MonitoringViewModel_OnSystemChanged; monitoringViewModel.PropertyChanged += VmOnPropertyChanged;
SetActiveTab(monitoringViewModel.SelectedTab); // 초기 반영
} }
private void MonitoringViewModel_OnSystemChanged(string systemName) private void VmOnPropertyChanged(object? sender, PropertyChangedEventArgs e)
{
switch (systemName)
{ {
case "Tank": if (e.PropertyName == nameof(MonitoringViewModel.SelectedTab) && sender is MonitoringViewModel vm)
//SetTankData(); SetActiveTab(vm.SelectedTab);
break;
case "Filter":
break;
case "System3":
break;
default:
break;
} }
}
private void SetTankData()
{
var waterTanksGroup = Datas.GetWaterQualityVO().GroupBy(w => w.Tank.Number);
foreach (var group in waterTanksGroup) private void SetActiveTab(MonitorTab tab)
{ {
DataGrid dataGrid = new DataGrid(); // 전부 Collapsed
svTanks.Visibility = Visibility.Collapsed;
var waterQualityList = group.ToList(); svFilter.Visibility = Visibility.Collapsed;
svSterilizer.Visibility = Visibility.Collapsed;
DataGridAutoBuilder.BuildColumnsFromType(dataGrid, waterQualityList, new Dictionary<string, string> // 대상만 Visible
{ if (_tabMap.TryGetValue(tab, out var target))
{ nameof(WaterQualityVO.RecordedTime), "시간" }, target.Visibility = Visibility.Visible;
{ nameof(WaterQualityVO.Tank.DOValue), "DO센서 (mg/L)" },
{ nameof(WaterQualityVO.Tank.PH), "pH센서" },
{ nameof(WaterQualityVO.Tank.ORP), "ORP센서 (mV)" },
{ nameof(WaterQualityVO.Tank.Temperature), "수온 (°C)" },
{ nameof(WaterQualityVO.Tank.FlowRate), "유량 (m³/s)"}
}, "HH:mm:ss");
//spDataGrid.Children.Add(dataGrid);
}
} }
} }
} }

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SmartAquaViewer.DataAnalysis;
namespace SmartAquaViewer.ViewModel
{
public interface IGridSection { string Title { get; } }
public class TankSection : IGridSection
{
public string Title { get; set; } = "수조";
public ObservableCollection<TankRow> Rows { get; } = new();
}
public class FilterSection : IGridSection
{
public string Title { get; set; } = "여과";
public ObservableCollection<FilterRow> Rows { get; } = new();
}
public class SterilizeSection : IGridSection
{
public string Title { get; set; } = "살균";
public ObservableCollection<SterRow> Rows { get; } = new();
}
// 예시 Row들
public class TankRow
{
public DateTime RecordedTime { get; set; }
public WaterTank Tank { get; set; }
}
public class FilterRow
{
public DateTime RecordedTime { get; set; }
public FilteringSystem Filter { get; set; }
}
public class SterRow
{
public DateTime RecordedTime { get; set; }
public SterilizingSystem Sterilizer { get; set; }
}
}

@ -12,12 +12,13 @@ using System.Windows.Input;
using SmartAquaViewer.Controls; using SmartAquaViewer.Controls;
using SmartAquaViewer.DataAnalysis; using SmartAquaViewer.DataAnalysis;
using SmartAquaViewer.Model; using SmartAquaViewer.Model;
using static SmartAquaViewer.Model.Enums;
namespace SmartAquaViewer.ViewModel namespace SmartAquaViewer.ViewModel
{ {
public class MonitoringViewModel : INotifyPropertyChanged public class MonitoringViewModel : INotifyPropertyChanged
{ {
public delegate void SystemChangedEventHandler(string systemName); public delegate void SystemChangedEventHandler(MonitorTab selectedTab);
public event SystemChangedEventHandler OnSystemChanged; public event SystemChangedEventHandler OnSystemChanged;
public ObservableCollection<string> GraphTypes { get; } public ObservableCollection<string> GraphTypes { get; }
@ -25,7 +26,6 @@ namespace SmartAquaViewer.ViewModel
public List<WaterQualityVO> WaterQualityList { get; } public List<WaterQualityVO> WaterQualityList { get; }
public Dictionary<int, ObservableCollection<WaterQualityVO>> TankGroups { get; } public Dictionary<int, ObservableCollection<WaterQualityVO>> TankGroups { get; }
private string _selectedGraphType; private string _selectedGraphType;
public string SelectedGraphType public string SelectedGraphType
{ {
@ -40,6 +40,23 @@ namespace SmartAquaViewer.ViewModel
} }
} }
private MonitorTab _selectedTab;
public MonitorTab SelectedTab
{
get => _selectedTab;
set
{
if (_selectedTab != value)
{
_selectedTab = value;
OnPropertyChanged();
Debug.WriteLine($"CurrentTab changed to: {_selectedTab}");
OnSystemChanged?.Invoke(SelectedTab);
}
}
}
private string _currentSystem; private string _currentSystem;
public string CurrentSystem public string CurrentSystem
{ {
@ -51,10 +68,8 @@ namespace SmartAquaViewer.ViewModel
_currentSystem = value; _currentSystem = value;
OnPropertyChanged(); OnPropertyChanged();
Debug.WriteLine($"CurrentSyetem changed to: {_currentSystem}");
SetGraphType(); SetGraphType();
SelectedGraphType = GraphTypes.FirstOrDefault() ?? string.Empty; SelectedGraphType = GraphTypes.FirstOrDefault() ?? string.Empty;
OnSystemChanged?.Invoke(CurrentSystem);
} }
} }
} }
@ -113,6 +128,7 @@ namespace SmartAquaViewer.ViewModel
WaterQualityList = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 1), 10); WaterQualityList = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 1), 10);
Datas.SetWaterQualityVO(WaterQualityList); Datas.SetWaterQualityVO(WaterQualityList);
TankGroups = WaterQualityList TankGroups = WaterQualityList
.GroupBy(x => x.Tank.Number) // 또는 x.Tank.Num .GroupBy(x => x.Tank.Number) // 또는 x.Tank.Num
.OrderBy(g => g.Key) .OrderBy(g => g.Key)
@ -122,6 +138,8 @@ namespace SmartAquaViewer.ViewModel
g.OrderBy(r => r.RecordedTime)) g.OrderBy(r => r.RecordedTime))
); );
GraphTypes = new ObservableCollection<string>(); GraphTypes = new ObservableCollection<string>();
CurrentSystem = "Tank"; // Default system CurrentSystem = "Tank"; // Default system
SetGraphType(); SetGraphType();

Loading…
Cancel
Save