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.Navigation;
using System.Windows.Shapes;
using static SmartAquaViewer.Model.Enums;
namespace SmartAquaViewer.Controls
{
@ -36,11 +37,21 @@ namespace SmartAquaViewer.Controls
DependencyProperty.Register(nameof(SelectedValue), typeof(string), typeof(SegmentedControl),
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)
{
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
{
class Enums
public class Enums
{
public enum PanelState
public enum MonitorTab
{
Hidden,
Normal,
Expanded
Tank,
Filter,
Sterilizer
}
}
}

@ -1,6 +1,9 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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="SCDream2">pack://application:,,,/Fonts/#S-Core Dream 2 ExtraLight</FontFamily>
@ -104,4 +107,14 @@
<Setter Property="VerticalContentAlignment" Value="Center"/>
</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>

@ -21,12 +21,12 @@
<ImageBrush ImageSource="/Resources/Images/top_bg.png" Stretch="Fill"/>
</Grid.Background>
<control:SegmentedControl x:Name="segmentedControl" Margin="20 10"
SelectedValue="{Binding CurrentSystem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
SelectedTab="{Binding SelectedTab, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</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"
HorizontalAlignment="Center">
HorizontalAlignment="Center" Visibility="Collapsed">
<ItemsControl ItemsSource="{Binding TankGroups}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
@ -44,11 +44,7 @@
<!-- Value(= ObservableCollection<WaterQualityVO>)로 DataGrid -->
<DataGrid ItemsSource="{Binding Value}"
AutoGenerateColumns="False"
CanUserAddRows="False"
IsReadOnly="True"
HeadersVisibility="Column"
IsHitTestVisible="True">
Style="{StaticResource DataGridStyle}">
<DataGrid.Columns>
<!-- 측정 시각 -->
@ -58,7 +54,7 @@
<!-- Tank 값들 -->
<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="ORP" Binding="{Binding Tank.ORP, StringFormat=\{0:F0\}}"/>
<DataGridTextColumn Header="온도(℃)" Binding="{Binding Tank.Temperature, StringFormat=\{0:F1\}}"/>
@ -71,6 +67,50 @@
</ItemsControl>
</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">
<Button Name="btnVisibilityDown" Tag="down"
Style="{StaticResource ImageButtonStyle}" Height="33" Command="{Binding ChangeDrawerStatusCommand}"

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -28,60 +29,45 @@ namespace SmartAquaViewer.View
{
private MonitoringViewModel? monitoringViewModel;
private readonly Dictionary<MonitorTab, ScrollViewer> _tabMap;
public MonitoringView()
{
InitializeComponent();
_tabMap = new Dictionary<MonitorTab, ScrollViewer>
{
{ MonitorTab.Tank, svTanks },
{ MonitorTab.Filter, svFilter },
{ MonitorTab.Sterilizer, svSterilizer }
};
Loaded += MonitoringView_Loaded;
}
private void MonitoringView_Loaded(object sender, RoutedEventArgs e)
{
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":
//SetTankData();
break;
case "Filter":
break;
case "System3":
break;
default:
break;
}
if (e.PropertyName == nameof(MonitoringViewModel.SelectedTab) && sender is MonitoringViewModel vm)
SetActiveTab(vm.SelectedTab);
}
private void SetTankData()
private void SetActiveTab(MonitorTab tab)
{
var waterTanksGroup = Datas.GetWaterQualityVO().GroupBy(w => w.Tank.Number);
foreach (var group in waterTanksGroup)
{
DataGrid dataGrid = new DataGrid();
var waterQualityList = group.ToList();
DataGridAutoBuilder.BuildColumnsFromType(dataGrid, waterQualityList, new Dictionary<string, string>
{
{ nameof(WaterQualityVO.RecordedTime), "시간" },
{ 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");
// 전부 Collapsed
svTanks.Visibility = Visibility.Collapsed;
svFilter.Visibility = Visibility.Collapsed;
svSterilizer.Visibility = Visibility.Collapsed;
//spDataGrid.Children.Add(dataGrid);
}
// 대상만 Visible
if (_tabMap.TryGetValue(tab, out var target))
target.Visibility = Visibility.Visible;
}
}
}

@ -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.DataAnalysis;
using SmartAquaViewer.Model;
using static SmartAquaViewer.Model.Enums;
namespace SmartAquaViewer.ViewModel
{
public class MonitoringViewModel : INotifyPropertyChanged
{
public delegate void SystemChangedEventHandler(string systemName);
public delegate void SystemChangedEventHandler(MonitorTab selectedTab);
public event SystemChangedEventHandler OnSystemChanged;
public ObservableCollection<string> GraphTypes { get; }
@ -25,7 +26,6 @@ namespace SmartAquaViewer.ViewModel
public List<WaterQualityVO> WaterQualityList { get; }
public Dictionary<int, ObservableCollection<WaterQualityVO>> TankGroups { get; }
private 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;
public string CurrentSystem
{
@ -51,10 +68,8 @@ namespace SmartAquaViewer.ViewModel
_currentSystem = value;
OnPropertyChanged();
Debug.WriteLine($"CurrentSyetem changed to: {_currentSystem}");
SetGraphType();
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);
Datas.SetWaterQualityVO(WaterQualityList);
TankGroups = WaterQualityList
.GroupBy(x => x.Tank.Number) // 또는 x.Tank.Num
.OrderBy(g => g.Key)
@ -122,6 +138,8 @@ namespace SmartAquaViewer.ViewModel
g.OrderBy(r => r.RecordedTime))
);
GraphTypes = new ObservableCollection<string>();
CurrentSystem = "Tank"; // Default system
SetGraphType();

Loading…
Cancel
Save