This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1,339 @@
<base:BaseView x:Class="GroupChannelList.GroupChannelListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:controls="clr-namespace:DTS.Common.Controls;assembly=DTS.Common"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:strings="clr-namespace:GroupChannelList"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="768" d:DesignWidth="1366"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:converters="clr-namespace:GroupChannelList.Converters"
xmlns:converters1="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
xmlns:cc="clr-namespace:ChannelCodes.Model;assembly=ChannelCodes"
xmlns:behaviors="clr-namespace:DTS.Common.Behaviors;assembly=DTS.Common"
xmlns:my="clr-namespace:DTS.Common.Enums;assembly=DTS.Common"
x:Name="ChannelListView">
<base:BaseView.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/DTS.Common;component/Themes/CommonStyles.xaml"/>
<ResourceDictionary Source="pack://application:,,,/DTS.Common;component/Controls/combobox.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="ToggleButton">
<Setter Property="Width" Value="20"/>
<Setter Property="MaxWidth" Value="20"/>
</Style>
<Style TargetType="ListView">
<Setter Property="ItemContainerStyle" Value="{StaticResource TTS_ListViewItemStyle}"/>
</Style>
<Style TargetType="TextBox" BasedOn="{StaticResource TTS_TextBoxStyle}"/>
<Style TargetType="TextBlock" BasedOn="{StaticResource TTS_TextBlockStyle}"/>
<Style TargetType="CheckBox" BasedOn="{StaticResource PageContentCheckBoxStyle}" />
<Style TargetType="ComboBox" BasedOn="{StaticResource TTS_ComboBoxStyle}"/>
<Style TargetType="Button" BasedOn="{StaticResource TTS_ButtonStyle}"/>
<Style TargetType="GridViewColumnHeader" BasedOn="{StaticResource Gray_GridViewColumnHeaderStyle}"/>
<converters:SensorIdBackgroundConverter x:Key="BackgroundConverter" />
<BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
<converters1:InverseBooleanToVisibilityConverter x:Key="InverseBoolToVisConverter" />
<converters:BooleanToWidthConverter x:Key="BooleanToWidthConverter" />
<converters1:InverseBooleanConverter x:Key="BooleanInverseConverter" />
<converters1:BooleanOrToVisibilityMultiConverter x:Key="BooleanOrToVisibilityMultiConverter"/>
</ResourceDictionary>
</base:BaseView.Resources>
<Grid Background="{DynamicResource Brush_ApplicationContentBackground}" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<WrapPanel Grid.Row="0" Orientation="Horizontal">
<TextBlock Text="{Binding ChannelCount, FallbackValue='0'}" Margin="10,0,0,0" AutomationProperties.AutomationId="ChannelCountLabel"/>
<TextBlock Text="{strings:TranslateExtension Channels}" AutomationProperties.AutomationId="ChannelsLabel"/>
<TextBlock Text="{strings:TranslateExtension Test}" Visibility="{Binding UseTestSetupOrder, Converter={StaticResource BoolToVisConverter}}" AutomationProperties.AutomationId="TestLabel"/>
<TextBlock Text="{strings:TranslateExtension GroupLower}" Visibility="{Binding UseTestSetupOrder, Converter={StaticResource InverseBoolToVisConverter}}" AutomationProperties.AutomationId="GroupLabel"/>
<TextBlock Margin="5,0,5,0" Text="" />
<TextBlock Text="{Binding AssignedPhysicalChannelCount}" />
<TextBlock Text="{strings:TranslateExtension Of}" />
<TextBlock Text="{Binding AvailableChannelCount}" />
<TextBlock Text="{strings:TranslateExtension PhysicalChannelsAssigned}" />
</WrapPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="2">
<Button Content="TOP" Width="30" IsEnabled="{Binding CanMoveSelectedUp}" Command="{Binding MoveSelectedChannelsToTopCommand}" AutomationProperties.AutomationId="SelectedTopButton" />
<Button Content="5" FontFamily="Marlett" Width="20" IsEnabled="{Binding CanMoveSelectedUp}" Command="{Binding MoveSelectedChannelsUpCommand}" AutomationProperties.AutomationId="SelectedUpButton" />
<Button Content="6" FontFamily="Marlett" Width="20" IsEnabled="{Binding CanMoveSelectedDown}" Command="{Binding MoveSelectedChannelsDownCommand}" AutomationProperties.AutomationId="SelectedDownButton"/>
<Button Content="BOT" Width="30" IsEnabled="{Binding CanMoveSelectedDown}" Command="{Binding MoveSelectedChannelsToBottomCommand}" AutomationProperties.AutomationId="SelectedBottomButton" />
<Button Content="{strings:TranslateExtension RemoveSensor}" IsEnabled="{Binding ElementName=ChannelListListView, Path=SelectedItems.Count}" Command="{Binding RemoveSelectedSensorsCommand}" AutomationProperties.AutomationId="ClearSelectedBtn" Width="120" />
<Button Content="{strings:TranslateExtension Delete}" IsEnabled="{Binding SelectedDeleteShouldBeEnabled}" ToolTipService.ShowOnDisabled="True" Command="{Binding DeleteSelectedChannelsCommand}" AutomationProperties.AutomationId="DeleteSelectedBtn" Width="70" >
<Button.ToolTip>
<ToolTip Visibility="{Binding SelectedDeleteShouldDisplayTooltip, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="{strings:TranslateExtension ChannelDelete_Tooltip}"/>
</ToolTip>
</Button.ToolTip>
</Button>
<Button Margin="12,3,3,0" Content="Move after row" Width="100" IsEnabled="{Binding SelectedDeleteShouldBeEnabled}" Command="{Binding MoveSelectedChannelsToIndexCommand}" AutomationProperties.AutomationId="MoveToIndexButton" />
<xctk:DoubleUpDown Value="{Binding Path=ExpectedIndex}" Margin="3,3,3,0" Width="60" Minimum="0" Maximum="{Binding ChannelCount}" />
</StackPanel>
<ListView Grid.Row="2" ItemsSource="{Binding Channels, UpdateSourceTrigger=PropertyChanged}"
AutomationProperties.AutomationId="ChannelListView" AllowDrop="True" DragOver="ChannelList_DragOver"
x:Name="ChannelListListView" Drop="ChannelList_Drop" SelectionMode="Extended"
VirtualizingStackPanel.IsVirtualizing="True" KeyUp="ListView_KeyUp"
>
<i:Interaction.Behaviors>
<behaviors:MultiSelectionBehavior SelectedItems="{Binding SelectedChannelItems}" />
</i:Interaction.Behaviors>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource TTS_ListViewItemStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ChannelStatus}" Value="{x:Static my:UIItemStatus.Success}">
<Setter Property="Background" Value="{StaticResource Brush_ApplicationStatus_Complete}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ChannelStatus}" Value="{x:Static my:UIItemStatus.Error}">
<Setter Property="Background" Value="{StaticResource Brush_ApplicationStatus_Failed}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ChannelStatus}" Value="{x:Static my:UIItemStatus.Warning}">
<Setter Property="Background" Value="{StaticResource Brush_Amber}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ChannelStatus}" Value="{x:Static my:UIItemStatus.None}">
<Setter Property="Background" Value="{StaticResource Brush_Table_RowBackground}" />
</DataTrigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource Brush_ApplicationSelectedBackground}" />
</Trigger>
<DataTrigger Binding="{Binding ElementName=ChannelListView, Path=ReadOnlyChannelsMode}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<controls:AutoSizedGridView AutomationProperties.AutomationId="CustomChannelsListGridView">
<GridViewColumn AutomationProperties.AutomationId="GroupColumn" x:Name="GroupColumn">
<controls:GridViewColumnHeaderSearchable Tag="GroupName" HeaderTitle="{strings:TranslateExtension Group}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" />
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox AutomationProperties.AutomationId="GroupNameTextBox" MinWidth="200" IsEnabled="{Binding GroupNameEditable}" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" behaviors:TextBoxPasteBehavior.PasteCommand="{Binding PasteCommand}" Tag="GroupName"
Binding.SourceUpdated="TextBoxSourceUpdated">
<TextBox.Text>
<Binding NotifyOnSourceUpdated="True" Path="GroupName" UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>
</TextBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserCodeColumn" x:Name="UserCodeColumn"
Width="{Binding ShowUserCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="UserCode" HeaderTitle="{strings:TranslateExtension UserCode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<controls:ChannelCodeBuilder Code="{Binding UserCode, Mode=TwoWay}" CodeType="User" ChannelCodeSelected="ChannelCodeBuilder_OnChannelCodeSelected"
ChannelCodesFunc="{Binding DataContext.ChannelCodesFunc, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
ShowChannelCodeLookupHelper="{Binding DataContext.ShowChannelCodeLookupHelper, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MinWidth="200"
AutomationProperties.AutomationId="UserCodeChannelCodeBuilder" Tag="UserCode">
<controls:ChannelCodeBuilder.Visibility>
<MultiBinding Converter="{StaticResource BooleanOrToVisibilityMultiConverter}" ConverterParameter="FALSE|HIDE">
<Binding Path="IsUart" />
<Binding Path="IsStreamIn" />
<Binding Path="IsStreamOut" />
</MultiBinding>
</controls:ChannelCodeBuilder.Visibility>
</controls:ChannelCodeBuilder>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserChannelNameColumn" x:Name="UserChannelNameColumn"
Width="{Binding ShowUserCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="UserChannelName" HeaderTitle="{strings:TranslateExtension UserChannelName}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<controls:ChannelNameBuilder ChannelName="{Binding UserChannelName, Mode=TwoWay}" CodeType="User"
ChannelCodeSelected="ChannelNameBuilder_OnChannelCodeSelected"
ChannelNamesFunc="{Binding DataContext.ChannelCodesFunc, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
ShowChannelCodeLookupHelper="{Binding DataContext.ShowChannelCodeLookupHelper, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MinWidth="200"
AutomationProperties.AutomationId="UserChannelNameTextBox" Tag="UserChannelName">
<controls:ChannelNameBuilder.Visibility>
<MultiBinding Converter="{StaticResource BooleanOrToVisibilityMultiConverter}" ConverterParameter="FALSE|HIDE">
<Binding Path="IsUart" />
<Binding Path="IsStreamIn" />
<Binding Path="IsStreamOut" />
</MultiBinding>
</controls:ChannelNameBuilder.Visibility>
</controls:ChannelNameBuilder>
<!--<TextBox Text="{Binding UserChannelName}" AutomationProperties.AutomationId="UserChannelNameTextBox"
MinWidth="200" KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MaxLength="250" behaviors:TextBoxPasteBehavior.PasteCommand="{Binding PasteCommand}"
Tag="UserChannelName"/>
-->
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ChannelNameColumn" x:Name="ChannelNameColumn"
Width="{Binding ChannelNamesOnly, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="UserChannelName" HeaderTitle="{strings:TranslateExtension ChannelName}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox Text="{Binding UserChannelName}" AutomationProperties.AutomationId="ChannelNameTextBox" MinWidth="200" KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MaxLength="250" behaviors:TextBoxPasteBehavior.PasteCommand="{Binding PasteCommand}" Tag="ChannelName"/>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ISOCodeColumn" x:Name="ISOCodeColumn"
Width="{Binding ShowISOCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="ISOCode" HeaderTitle="{strings:TranslateExtension ISOCode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<!--<TextBox Text="{Binding IsoCode, Mode=TwoWay}" KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MinWidth="200"/>AllChannelCodes="{x:Static cc:ChannelCode.ChannelCodes}"-->
<controls:ChannelCodeBuilder Code="{Binding IsoCode, Mode=TwoWay}" CodeType="ISO" ChannelCodeSelected="ChannelCodeBuilder_OnChannelCodeSelected"
ChannelCodesFunc="{Binding DataContext.ChannelCodesFunc, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
ShowChannelCodeLookupHelper="{Binding DataContext.ShowChannelCodeLookupHelper, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
ShowISOStringBuilder="{Binding DataContext.ShowISOStringBuilder, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
UniqueISOCodesRequired="{Binding DataContext.UniqueISOCodesRequired, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MinWidth="200"
AutomationProperties.AutomationId="ISOCodeChannelCodeBuilder" Tag="ISOCode"
LostFocus="ISOCode_LostFocus"
UseISOCodeFilterMapping="{Binding DataContext.UseISOCodeFilterMapping, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
CoerceISOCode="{Binding CoerceISOCodeFunc}"
>
<controls:ChannelCodeBuilder.Visibility>
<MultiBinding Converter="{StaticResource BooleanOrToVisibilityMultiConverter}" ConverterParameter="FALSE|HIDE">
<Binding Path="IsUart" />
<Binding Path="IsStreamIn" />
<Binding Path="IsStreamOut" />
</MultiBinding>
</controls:ChannelCodeBuilder.Visibility>
</controls:ChannelCodeBuilder>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ISOChannelNameColumn" x:Name="ISOChannelNameColumn"
Width="{Binding ShowISOCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="ISOChannelName" HeaderTitle="{strings:TranslateExtension ISOChannelName}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<controls:ChannelNameBuilder ChannelName="{Binding IsoChannelName, Mode=TwoWay}" CodeType="ISO"
ChannelCodeSelected="ChannelNameBuilder_OnChannelCodeSelected"
ChannelNamesFunc="{Binding DataContext.ChannelCodesFunc, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
ShowChannelCodeLookupHelper="{Binding DataContext.ShowChannelCodeLookupHelper, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" MinWidth="200"
AutomationProperties.AutomationId="ISOChannelNameTextBox" Tag="ISOChannelName"
LostFocus="ISOCode_LostFocus" >
<controls:ChannelNameBuilder.Visibility>
<MultiBinding Converter="{StaticResource BooleanOrToVisibilityMultiConverter}" ConverterParameter="FALSE|HIDE">
<Binding Path="IsUart" />
<Binding Path="IsStreamIn" />
<Binding Path="IsStreamOut" />
</MultiBinding>
</controls:ChannelNameBuilder.Visibility>
</controls:ChannelNameBuilder>
<!--<TextBox Text="{Binding IsoChannelName}" AutomationProperties.AutomationId="ISOChannelNameTextBox"
MinWidth="200" KeyDown="TextBox_KeyDown" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop"
MaxLength="250" behaviors:TextBoxPasteBehavior.PasteCommand="{Binding PasteCommand}" Tag="ISOChannelName"/>
-->
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="IEPEColumn" >
<controls:GridViewColumnHeaderSearchable Tag="IEPE" HeaderTitle="{strings:TranslateExtension ChannelType}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding IEPESupport}" AutomationProperties.AutomationId="IEPESupportBlock" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SensorColumn" >
<controls:GridViewColumnHeaderSearchable Tag="Sensor" HeaderTitle="{strings:TranslateExtension Sensor}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid>
<Label Visibility="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolToVisConverter}}">
<Hyperlink Click="Hyperlink_Click" IsEnabled="{Binding EmbeddedSensor, Converter={StaticResource BooleanInverseConverter}}">
<TextBlock Text="{Binding Sensor}" AutomationProperties.AutomationId="SensorTextBlock" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" />
</Hyperlink>
</Label>
<TextBlock Text="{Binding Sensor}" AutomationProperties.AutomationId="SensorTextBlock" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource BoolToVisConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="DallasIdColumn" x:Name="DallasIdColumn">
<controls:GridViewColumnHeaderSearchable Tag="DallasId" HeaderTitle="{strings:TranslateExtension DallasId}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding Path=SensorData.EID, FallbackValue='---'}" AutomationProperties.AutomationId="EIDTextBlock" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop"
Visibility="Visible"/>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="HardwareColumn" x:Name="HardwareColumn">
<controls:GridViewColumnHeaderSearchable Tag="Hardware" HeaderTitle="{strings:TranslateExtension Hardware}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Border Background="{Binding Path=HasEID, Converter={StaticResource BackgroundConverter}}" HorizontalAlignment="Stretch" >
<TextBlock Margin="2,0,2,0" Text="{Binding Hardware}" AutomationProperties.AutomationId="HardwareTextBlock" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" />
</Border>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="GroupOrderColumn" x:Name="GroupOrderColumn">
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=ChannelListView, Path=DataContext.UseTestSetupOrder, Converter={StaticResource InverseBoolToVisConverter}}">
<Button Content="TOP" Width="30" IsEnabled="{Binding CanMoveUp}" Click="MoveTop_Click" AutomationProperties.AutomationId="TopButton" />
<Button Content="5" FontFamily="Marlett" Width="20" IsEnabled="{Binding CanMoveUp}" Click="MoveUp_Click" AutomationProperties.AutomationId="UpButton" />
<TextBlock Text="{Binding GroupChannelOrder,FallbackValue='-1',StringFormat={}000}" VerticalAlignment="Center" AutomationProperties.AutomationId="ChannelOrderTextBlock" />
<Button Content="6" FontFamily="Marlett" Width="20" IsEnabled="{Binding CanMoveDown}" Click="MoveDown_Click" AutomationProperties.AutomationId="DownButton"/>
<Button Content="BOT" Width="30" IsEnabled="{Binding CanMoveDown}" Click="MoveBottom_Click" AutomationProperties.AutomationId="BottomButton" />
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="TestSetupOrderColumn" x:Name="TestSetupOrderColumn">
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=ChannelListView, Path=DataContext.UseTestSetupOrder, Converter={StaticResource BoolToVisConverter}}">
<Button Content="TOP" Width="30" IsEnabled="{Binding CanMoveUp}" Click="MoveTop_Click" AutomationProperties.AutomationId="TopButton"/>
<Button Content="5" FontFamily="Marlett" Width="20" IsEnabled="{Binding CanMoveUp}" Click="MoveUp_Click" AutomationProperties.AutomationId="UpButton"/>
<TextBlock Text="{Binding TestSetupOrder,FallbackValue='-1',StringFormat={}000}" VerticalAlignment="Center" AutomationProperties.AutomationId="ChannelOrderTextBlock"/>
<Button Content="6" FontFamily="Marlett" Width="20" IsEnabled="{Binding CanMoveDown}" Click="MoveDown_Click" AutomationProperties.AutomationId="DownButton"/>
<Button Content="BOT" Width="30" IsEnabled="{Binding CanMoveDown}" Click="MoveBottom_Click" AutomationProperties.AutomationId="BottomButton"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ActionsColumn">
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="{strings:TranslateExtension RemoveSensor}" Click="Clear_Click" AutomationProperties.AutomationId="ClearBtn" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" Width="120" Visibility="{Binding RemoveSensorVisibility}"/>
<Button Content="{strings:TranslateExtension Delete}" Click="Delete_Click" AutomationProperties.AutomationId="DeleteBtn" AllowDrop="True" PreviewDragOver="TextBox_DragOver" Drop="TextBox_Drop" Width="70"
IsEnabled="{Binding DeleteShouldBeEnabled}" ToolTipService.ShowOnDisabled="True">
<Button.ToolTip>
<ToolTip Visibility="{Binding DeleteShouldBeEnabled, Converter={StaticResource InverseBoolToVisConverter}}">
<TextBlock Text="{strings:TranslateExtension ChannelDelete_Tooltip}"/>
</ToolTip>
</Button.ToolTip>
</Button>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</controls:AutoSizedGridView>
</ListView.View>
</ListView>
</Grid>
</base:BaseView>

View File

@@ -0,0 +1,957 @@
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using DTS.Common.Classes.Groups;
using DTS.Common.Classes.Sensors.SensorsList;
using DTS.Common.Controls;
using DTS.Common.Enums;
using DTS.Common.Enums.Channels;
using DTS.Common.Events;
using DTS.Common.Events.Groups.GroupChannelList;
using DTS.Common.Interface.Channels;
using DTS.Common.Interface.DataRecorders;
using DTS.Common.Interface.Groups.GroupChannelList;
using DTS.Common.Settings;
using DTS.Common.Utils;
using Prism.Ioc;
using Prism.Events;
// ReSharper disable CheckNamespace
namespace GroupChannelList
{
/// <inheritdoc cref="IGroupChannelListView" />
/// <summary>
/// Interaction logic for GroupChannelListView.xaml
/// </summary>
public partial class GroupChannelListView : IGroupChannelListView
{
/// <summary>
/// returns whether the user input controls in the view should be read only
/// 16284 Channels table in EditTestSetup is enabled when it shouldn't be
/// </summary>
public bool ReadOnlyChannelsMode
{
get
{
if (null == DataContext) { return false; }
if (DataContext is IGroupChannelListViewModel model)
{
return model.ReadOnlyChannelsMode;
}
return false;
}
}
public GroupChannelListView()
{
InitializeComponent();
var eventAggregator = ContainerLocator.Container.Resolve<IEventAggregator>();
eventAggregator.GetEvent<ListViewStatusEvent>().Subscribe(OnListViewEvent);
}
private void OnListViewEvent(ListViewStatusArg arg)
{
if (arg.Status != ListViewStatusArg.ListViewStatus.ScrollToBottom)
{
return;
}
if (!(DataContext is GroupChannelListViewModel model))
{
return;
}
if (model.ListViewId != arg.Id) { return; }
ChannelListListView.Items.MoveCurrentToLast();
ChannelListListView.ScrollIntoView(ChannelListListView.Items.CurrentItem);
}
private void Clear_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is GroupChannelListViewModel viewModel))
{
return;
}
if (!(sender is Control control))
{
return;
}
if (!(control.DataContext is IGroupChannel channel))
{
return;
}
viewModel.Clear(channel);
viewModel.NotifyChannelsChanged();
}
private void Delete_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is GroupChannelListViewModel viewModel)) { return; }
if (!(sender is Control control)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
if (channel.IsBlank())
{
//14546
// Cannot use delete action button in edit group/test
// it's possible the channel is blank but still has an order assigned, we have to allow it to be
// deleted still then ...
if (viewModel.UseTestSetupOrder)
{
if (channel.TestSetupOrder <= 0) { return; }
}
else
{
if (channel.GroupChannelOrder <= 0) { return; }
}
}
var eventAggregator = ContainerLocator.Container.Resolve<IEventAggregator>();
eventAggregator.GetEvent<GroupChannelDeleteRequestEvent>().Publish(new GroupChannelDeleteRequestEventArgs(
viewModel.Page,
channel));
}
private void GridViewColumnHeaderSearchable_OnSearch(object sender, RoutedEventArgs e)
{
var searchTerm = (string)e.OriginalSource;
var columnTag = (sender as GridViewColumnHeaderSearchable)?.Tag;
var viewModel = (IGroupChannelListViewModel)DataContext;
viewModel.Filter(columnTag, searchTerm);
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (!(DataContext is GroupChannelListViewModel viewModel)) { return; }
if (!(sender is Control control)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
viewModel.MarkModified(channel);
}
public void HandleColumns(IsoViewMode viewMode)
{
if (!(DataContext is IGroupChannelListViewModel vm))
{
return;
}
var showGroups = SettingsDB.GetGlobalValueBool("ShowGroups", true);
if (!vm.UseTestSetupOrder || !showGroups)
{
RemoveGroupColumn();
}
else
{
AddGroupColumn();
}
switch (viewMode)
{
case IsoViewMode.ISOOnly:
RemoveUserCodeColumns();
AddIsoCodeColumns(vm.UseTestSetupOrder);
break;
case IsoViewMode.ISOAndUserCode:
AddUserAndIsoCodeColumns(vm.UseTestSetupOrder);
break;
case IsoViewMode.UserCodeOnly:
RemoveIsoCodeColumns();
AddUserCodeColumns(vm.UseTestSetupOrder, true);
break;
case IsoViewMode.ChannelNameOnly:
RemoveIsoCodeColumns();
AddUserCodeColumns(vm.UseTestSetupOrder, false);
break;
}
if (vm.UseTestSetupOrder)
{
ShowTestSetupOrder(true);
}
else
{
ShowTestSetupOrder(false);
}
if (vm.ShowDallasIdColumn)
{
AddDallasIdColumn();
}
else { RemoveDallasIdColumn(); }
}
private void ShowTestSetupOrder(bool test)
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (test)
{
if (view.Columns.Contains(GroupOrderColumn))
{
view.Columns.Remove(GroupOrderColumn);
}
if (!view.Columns.Contains(TestSetupOrderColumn))
{
view.Columns.Insert(0, TestSetupOrderColumn);
}
}
else
{
if (view.Columns.Contains(TestSetupOrderColumn))
{
view.Columns.Remove(TestSetupOrderColumn);
}
if (!view.Columns.Contains(GroupOrderColumn))
{
view.Columns.Insert(0, GroupOrderColumn);
}
}
}
private void RemoveGroupColumn()
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (view.Columns.Contains(GroupColumn))
{
view.Columns.Remove(GroupColumn);
}
}
private void AddDallasIdColumn()
{
if (!(ChannelListListView.View is AutoSizedGridView view))
{
return;
}
if (!view.Columns.Contains(DallasIdColumn))
{
var index = view.Columns.IndexOf(HardwareColumn);
view.Columns.Insert(index, DallasIdColumn);
}
}
private void RemoveDallasIdColumn()
{
if (!(ChannelListListView.View is AutoSizedGridView view))
{
return;
}
if (view.Columns.Contains(DallasIdColumn))
{
view.Columns.Remove(DallasIdColumn);
}
}
private void AddGroupColumn()
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (!view.Columns.Contains(GroupColumn))
{
view.Columns.Insert(1, GroupColumn);
}
}
private void AddUserAndIsoCodeColumns(bool usingTestSetup)
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (!view.Columns.Contains(UserCodeColumn))
{
view.Columns.Insert(usingTestSetup ? 1 : 0, UserCodeColumn);
}
if (!view.Columns.Contains(UserChannelNameColumn))
{
view.Columns.Insert(usingTestSetup ? 2 : 1, UserChannelNameColumn);
}
if (!view.Columns.Contains(ISOCodeColumn))
{
view.Columns.Insert(usingTestSetup ? 3 : 2, ISOCodeColumn);
}
if (!view.Columns.Contains(ISOChannelNameColumn))
{
view.Columns.Insert(usingTestSetup ? 4 : 3, ISOChannelNameColumn);
}
}
private void AddIsoCodeColumns(bool usingTestSetup)
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (!view.Columns.Contains(ISOCodeColumn))
{
view.Columns.Insert(usingTestSetup ? 1 : 0, ISOCodeColumn);
}
if (!view.Columns.Contains(ISOChannelNameColumn))
{
view.Columns.Insert(usingTestSetup ? 2 : 1, ISOChannelNameColumn);
}
}
private void RemoveIsoCodeColumns()
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (view.Columns.Contains(ISOCodeColumn))
{
view.Columns.Remove(ISOCodeColumn);
}
if (view.Columns.Contains(ISOChannelNameColumn))
{
view.Columns.Remove(ISOChannelNameColumn);
}
}
private void RemoveUserCodeColumns()
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
if (view.Columns.Contains(UserCodeColumn))
{
view.Columns.Remove(UserCodeColumn);
}
if (view.Columns.Contains(UserChannelNameColumn))
{
view.Columns.Remove(UserChannelNameColumn);
}
}
private void AddUserCodeColumns(bool usingTestSetup, bool addCodeColumn)
{
if (!(ChannelListListView.View is DTS.Common.Controls.AutoSizedGridView view))
{
return;
}
var insertPoint = usingTestSetup ? 1 : 0;
if (!view.Columns.Contains(UserCodeColumn) && addCodeColumn)
{
view.Columns.Insert(insertPoint, UserCodeColumn);
}
if (addCodeColumn)
{
insertPoint++;
}
if (!view.Columns.Contains(UserChannelNameColumn))
{
view.Columns.Insert(insertPoint, UserChannelNameColumn);
}
}
private void ChannelList_DragOver(object sender, DragEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
var lv = ChannelListListView;
var index = GetIndex(lv);
if (index < 0)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
if (lv.Items.Count <= index)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
if (!(lv.Items[index] is GroupChannel item))
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
if (null == e.Data)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
var formats = e.Data.GetFormats();
foreach (var format in formats)
{
switch (format)
{
case DragAndDropPayload.ALT_FORMAT:
e.Effects = DragDropEffects.Copy;
e.Handled = true;
return;
case DragAndDropPayload.CTRL_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
case DragAndDropPayload.FORMAT:
e.Effects = DragDropEffects.Copy;
e.Handled = true;
return;
case DTS.Common.Classes.Hardware.DragAndDropPayload.FORMAT:
e.Effects = DragDropEffects.Copy;
e.Handled = true;
return;
case DTS.Common.Classes.Hardware.DragAndDropPayload.CTRL_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
case DTS.Common.Classes.Hardware.DragAndDropPayload.ALT_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
default:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
}
e.Effects = DragDropEffects.None;
e.Handled = true;
}
private static int GetIndex(ListView lv)
{
for (var i = 0; i < lv.Items.Count; i++)
{
var item = GetListViewItem(lv, i);
if (null == item) { continue; }
if (IsMouseOverTarget(item))
{
return i;
}
}
return -1;
}
private static ListViewItem GetListViewItem(ListView lv, int index)
{
if (lv.ItemContainerGenerator.Status !=
System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
return null;
}
return (ListViewItem)lv.ItemContainerGenerator.ContainerFromIndex(index);
}
private static bool IsMouseOverTarget(Visual target)
{
if (null == target) { return false; }
// We need to use MouseUtilities to figure out the cursor
// coordinates because, during a drag-drop operation, the WPF
// mechanisms for getting the coordinates behave strangely.
var bounds = VisualTreeHelper.GetDescendantBounds(target);
var mousePos = MouseUtilities.GetMousePosition(target);
var bContained = bounds.Contains(mousePos);
return bContained;
}
private void ChannelList_Drop(object sender, DragEventArgs e)
{
if (!(DataContext is GroupChannelListViewModel vm)) { return; }
var lv = ChannelListListView;
var index = GetIndex(lv);
if (index < 0)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
if (lv.Items.Count <= index)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
if (null == e.Data)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
var formats = e.Data.GetFormats();
if (((int)e.KeyStates & (int)DragDropKeyStates.AltKey) == (int)DragDropKeyStates.AltKey)
{
for (var i = 0; i < formats.Length; i++)
{
formats[i] = $"ALT_{formats[i]}";
}
}
else if (((int)e.KeyStates & (int)DragDropKeyStates.ControlKey) == (int)DragDropKeyStates.ControlKey)
{
for (var i = 0; i < formats.Length; i++)
{
formats[i] = $"CTRL_{formats[i]}";
}
}
foreach (var format in formats)
{
switch (format)
{
case DragAndDropPayload.FORMAT: //insert sensors on the channels in question
vm.DoSensorAssignment((IGroupChannel)ChannelListListView.Items[index], ((DragAndDropPayload)e.Data.GetData(format)).Items);
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.FORMAT: //insert hardware assignments at the channel in question
vm.DoHardwareAssignment((IGroupChannel)ChannelListListView.Items[index], (IHardwareChannel[])e.Data.GetData(format));
e.Handled = true;
break;
case DragAndDropPayload.ALT_FORMAT:
case DragAndDropPayload.CTRL_FORMAT:
case DTS.Common.Classes.Hardware.DragAndDropPayload.CTRL_FORMAT:
case DTS.Common.Classes.Hardware.DragAndDropPayload.ALT_FORMAT:
default:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
}
CheckDragAndDropFilterWarning();
}
private void CheckDragAndDropFilterWarning()
{
if (!(DataContext is GroupChannelListViewModel viewModel)) { return; }
viewModel.NotifyUserIfFiltering();
}
private void TextBox_DragOver(object sender, DragEventArgs e)
{
if (null == e.Data)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
var formats = e.Data.GetFormats();
if (((int)e.KeyStates & (int)DragDropKeyStates.AltKey) == (int)DragDropKeyStates.AltKey)
{
for (var i = 0; i < formats.Length; i++)
{
formats[i] = $"ALT_{formats[i]}";
}
}
else if (((int)e.KeyStates & (int)DragDropKeyStates.ControlKey) == (int)DragDropKeyStates.ControlKey)
{
for (var i = 0; i < formats.Length; i++)
{
formats[i] = $"CTRL_{formats[i]}";
}
}
foreach (var format in formats)
{
switch (format)
{
case DragAndDropPayload.ALT_FORMAT:
e.Effects = DragDropEffects.Copy;
e.Handled = true;
break;
case DragAndDropPayload.CTRL_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
break;
case DragAndDropPayload.FORMAT: //insert sensors on the channels in question
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.FORMAT: //insert hardware assignments at the channel in question
//DoHardwareAssignment(index, e.Data.GetData(format) as IHardwareChannel[]);
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.CTRL_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.ALT_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
break;
default:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
}
}
private void TextBox_Drop(object sender, DragEventArgs e)
{
if (null == e.Data)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
IGroupChannel groupChannel = null;
if (sender is Control control)
{
groupChannel = (IGroupChannel)control.DataContext;
}
else if (sender is TextBlock textBlock)
{
groupChannel = (IGroupChannel)textBlock.DataContext;
}
else
{
e.Effects = DragDropEffects.None;
e.Handled = false;
return;
}
if (!(DataContext is GroupChannelListViewModel vm))
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
if (null == groupChannel)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
var formats = e.Data.GetFormats();
if (((int)e.KeyStates & (int)DragDropKeyStates.AltKey) == (int)DragDropKeyStates.AltKey)
{
for (var i = 0; i < formats.Length; i++)
{
formats[i] = $"ALT_{formats[i]}";
}
}
else if (((int)e.KeyStates & (int)DragDropKeyStates.ControlKey) == (int)DragDropKeyStates.ControlKey)
{
for (var i = 0; i < formats.Length; i++)
{
formats[i] = $"CTRL_{formats[i]}";
}
}
foreach (var format in formats)
{
switch (format)
{
case DragAndDropPayload.ALT_FORMAT:
e.Effects = DragDropEffects.Copy;
e.Handled = true;
break;
case DragAndDropPayload.CTRL_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
break;
case DragAndDropPayload.FORMAT: //insert sensors on the channels in question
var payload = (DragAndDropPayload)e.Data.GetData(format);
vm.DoSensorAssignment(groupChannel, payload.Items);
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.FORMAT: //insert hardware assignments at the channel in question
vm.DoHardwareAssignment(groupChannel, e.Data.GetData(format) as IHardwareChannel[]);
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.CTRL_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
break;
case DTS.Common.Classes.Hardware.DragAndDropPayload.ALT_FORMAT:
e.Effects = DragDropEffects.None;
e.Handled = true;
break;
default:
e.Effects = DragDropEffects.None;
e.Handled = true;
return;
}
}
CheckDragAndDropFilterWarning();
}
private void MoveBottom_Click(object sender, RoutedEventArgs e)
{
if (!(sender is Control control)) { return; }
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
var items = ChannelListListView.SelectedItems;
if (items.Count > 1 && items.Contains(channel))
{
IGroupChannel[] groupChannels = GetSelectedChannelsOrdered();
vm.MoveBottom(groupChannels);
}
else
{
vm.MoveBottom(new[] { channel });
}
}
private void MoveDown_Click(object sender, RoutedEventArgs e)
{
if (!(sender is Control control)) { return; }
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
var items = ChannelListListView.SelectedItems;
if (items.Count > 1 && items.Contains(channel))
{
IGroupChannel[] groupChannels = GetSelectedChannelsOrdered();
vm.MoveDown(groupChannels);
}
else
{
vm.MoveDown(new[] { channel });
}
}
private void MoveUp_Click(object sender, RoutedEventArgs e)
{
if (!(sender is Control control)) { return; }
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
var items = ChannelListListView.SelectedItems;
if (items.Count > 1 && items.Contains(channel))
{
IGroupChannel[] groupChannels = GetSelectedChannelsOrdered();
vm.MoveUp(groupChannels);
}
else
{
vm.MoveUp(new[] { channel });
}
}
private IGroupChannel[] GetSelectedChannelsOrdered()
{
var list = new List<IGroupChannel>();
foreach (var item in ChannelListListView.SelectedItems)
{
if (item is IGroupChannel channel)
{
list.Add(channel);
}
}
list.Sort((a, b) =>
{
return ChannelListListView.Items.IndexOf(a).CompareTo(ChannelListListView.Items.IndexOf(b));
});
return list.ToArray();
}
private void MoveTop_Click(object sender, RoutedEventArgs e)
{
if (!(sender is Control control)) { return; }
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
var items = ChannelListListView.SelectedItems;
if (items.Count > 1 && items.Contains(channel))
{
IGroupChannel[] groupChannels = GetSelectedChannelsOrdered();
vm.MoveTop(groupChannels);
}
else
{
vm.MoveTop(new[] { channel });
}
}
private void ChannelCodeBuilder_OnChannelCodeSelected(object sender, string code, string name, ChannelEnumsAndConstants.ChannelCodeType codeType)
{
if (!(DataContext is GroupChannelListViewModel viewModel)) { return; }
if (!(sender is Control control)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
if (codeType == ChannelEnumsAndConstants.ChannelCodeType.ISO)
{
channel.IsoCode = code;
if (string.IsNullOrWhiteSpace(channel.IsoChannelName))
{
channel.IsoChannelName = name;
}
}
else
{
channel.UserCode = code;
if (string.IsNullOrWhiteSpace(channel.UserChannelName))
{
channel.UserChannelName = name;
}
}
viewModel.MarkModified(channel);
}
/// <summary>
/// Sets channel code/name when the user clicks on a selection from the popup window
/// 17565 - Predictive text on "ISO channel name" column when in test set up / groups to make
/// </summary
private void ChannelNameBuilder_OnChannelCodeSelected(object sender, string code, string name, ChannelEnumsAndConstants.ChannelCodeType codeType)
{
if (!(DataContext is GroupChannelListViewModel viewModel)) { return; }
if (!(sender is Control control)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
if (codeType == ChannelEnumsAndConstants.ChannelCodeType.ISO)
{
channel.IsoChannelName = name;
channel.IsoCode = code;
}
else
{
channel.UserChannelName = name;
channel.UserCode = code;
}
viewModel.MarkModified(channel);
}
private void TextBoxSourceUpdated(object sender, System.Windows.Data.DataTransferEventArgs e)
{
//this is slightly complicated, when the group name changes:
//1) remove this channel from the channel list for the old group
//2) remove the old group if it's now empty
//3) add a new group if one doesn't exist
//4) add the channel to the group
if (!(DataContext is GroupChannelListViewModel vm))
{
return;
}
if (!(((Control)sender).DataContext is IGroupChannel groupChannel))
{
return;
}
vm.GroupNameChanged(groupChannel);
vm.MarkModified(groupChannel);
}
private void ChannelListListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void ListView_KeyUp(object sender, KeyEventArgs e)
{
if (ChannelListListView.SelectedItems.Count <= 0) { return; }
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{
switch (e.Key)
{
case Key.System:
if (e.SystemKey == Key.Up) { Move(true); }
else if (e.SystemKey == Key.Down) { Move(false); }
break;
}
}
if (Keyboard.IsKeyDown(Key.Up) && e.Key == Key.LeftAlt)
{
Move(true);
}
else if (Keyboard.IsKeyDown(Key.Up) && e.Key == Key.RightAlt)
{
Move(true);
}
else if (Keyboard.IsKeyDown(Key.Down) && e.Key == Key.LeftAlt)
{
Move(false);
}
else if (Keyboard.IsKeyDown(Key.Down) && e.Key == Key.RightAlt)
{
Move(false);
}
}
private void Move(bool bUp)
{
if (!(DataContext is GroupChannelListViewModel vm))
{
return;
}
var list = new List<IGroupChannel>();
foreach (var item in ChannelListListView.SelectedItems)
{
if (!(item is IGroupChannel groupChannel))
{
continue;
}
list.Add(groupChannel);
}
if (bUp)
{
vm.MoveUp(list.ToArray());
}
else
{
vm.MoveDown(list.ToArray());
}
}
private void ISOCode_LostFocus(object sender, RoutedEventArgs e)
{
if (!(DataContext is GroupChannelListViewModel viewModel)) { return; }
if (!(sender is Control control)) { return; }
if (!(control.DataContext is IGroupChannel channel)) { return; }
if (viewModel.UseISOCodeFilterMapping)
{
//FB 15523 passes available filters
var filters = DTS.SensorDB.SoftwareFilter.GetSoftwareFilters();
//FB 15574 FB 13120
channel.FilterClass = channel.GetFilterClassFromISOCode(filters, channel.IsoCode);
}
}
/// <summary>
/// handles hyperlink clicks, specifically for a sensor
/// 15125 Navigate to selected sensor from run test diagnostics
/// </summary>
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is GroupChannelListViewModel vm)) { return; }
if (!(sender is Hyperlink hl)) { return; }
if (!(hl.DataContext is GroupChannel groupChannel)) { return; }
var eventAggregator = ContainerLocator.Container.Resolve<IEventAggregator>();
eventAggregator.GetEvent<PageNavigationRequestEvent>().Publish(new PageNavigationRequest(
PageNavigationRequest.Destinations.Sensor,
groupChannel,
vm));
}
}
}

View File

@@ -0,0 +1,913 @@
<base:BaseView x:Class="GroupChannelList.GroupChannelSettingsListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:controls="clr-namespace:DTS.Common.Controls;assembly=DTS.Common"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:strings="clr-namespace:GroupChannelList"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="500"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:converters="clr-namespace:GroupChannelList.Converters"
xmlns:converters1="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
xmlns:cc="clr-namespace:ChannelCodes.Model;assembly=ChannelCodes"
xmlns:behaviors="clr-namespace:DTS.Common.Behaviors;assembly=DTS.Common"
xmlns:sensors="clr-namespace:DTS.Common.Enums.Sensors;assembly=DTS.Common"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:validators="clr-namespace:DTS.Common.Validators;assembly=DTS.Common"
xmlns:constants="clr-namespace:DTS.Common.Constant;assembly=DTS.Common"
x:Name="ChannelListView">
<base:BaseView.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/DTS.Common;component/Themes/CommonStyles.xaml"/>
<ResourceDictionary Source="pack://application:,,,/DTS.Common;component/Controls/combobox.xaml"/>
<ResourceDictionary Source="pack://application:,,,/DTS.Common;component/Constant/XamlConstants.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="RadioButton" BasedOn="{StaticResource FlatRadioButtonStyle}" >
<Setter Property="Height" Value="24" />
<Setter Property="Margin" Value="5" />
</Style>
<Style TargetType="ListView">
<Setter Property="ItemContainerStyle" Value="{StaticResource TTS_ListViewItemStyle}"/>
</Style>
<Style TargetType="TextBox" BasedOn="{StaticResource TTS_TextBoxStyle}"/>
<Style TargetType="TextBlock" BasedOn="{StaticResource TTS_TextBlockStyle}"/>
<Style TargetType="CheckBox" BasedOn="{StaticResource PageContentCheckBoxStyle}" />
<Style TargetType="ComboBox" BasedOn="{StaticResource TTS_ComboBoxStyle}">
<Setter Property="Height" Value="20"/>
</Style>
<Style TargetType="Button" BasedOn="{StaticResource TTS_ButtonStyle}"/>
<Style TargetType="GridViewColumnHeader" BasedOn="{StaticResource Gray_GridViewColumnHeaderStyle}"/>
<Style TargetType="{x:Type xctk:DoubleUpDown}" BasedOn="{StaticResource PageContentXCDoubleUpDown}" />
<converters:SensorIdBackgroundConverter x:Key="BackgroundConverter" />
<converters1:NumericStringFormatConverter x:Key="NumericStringFormatConverter" />
<!--<BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>-->
<converters1:BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
<converters1:InverseBooleanToVisibilityConverter x:Key="InverseBoolToVisConverter" />
<converters:BooleanToWidthConverter x:Key="BooleanToWidthConverter" />
<converters1:EnumVisibilityConverter x:Key="EnumVisibilityConverter" />
<converters1:InverseEnumVisibilityConverter x:Key="InverseEnumVisibilityConverter" />
<converters1:BooleanToBorderBrushConverter x:Key="BooleanToBorderBrushConverter" />
<converters1:InverseBooleanConverter x:Key="InverseBoolConverter" />
<system:String x:Key="CapacityFormat">{0:N2}</system:String>
<converters1:GreaterEqualThanToBoolConverter x:Key="GreaterThanConverter" />
<system:UInt16 x:Key="IntervalOnBound">1</system:UInt16>
<converters1:IntervalToVisibilityConverter x:Key="InterveralToVisConverter" />
<converters1:BooleanOrMultiConverter x:Key="BooleanOrMultiConverter" />
</ResourceDictionary>
</base:BaseView.Resources>
<Grid Background="{DynamicResource Brush_ApplicationContentBackground}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<WrapPanel Grid.Row="0" Orientation="Horizontal">
<RadioButton Content="{strings:TranslateExtension Parameters_Analog}" x:Name="rbParametersAnalog" Click="Analog_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_Squib}" x:Name="rbParametersSquib" Click="Squib_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_DigitalOut}" x:Name="rbParametersDigitalOut" Click="DigitalOut_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_DigitalIn}" x:Name="rbParametersDigitalIn" Click="DigitalIn_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_Uart}" x:Name="rbParametersUart" Click="Uart_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_StreamOut}" x:Name="rbParametersStreamOut" Click="StreamOut_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_StreamIn}" x:Name="rbParametersStreamIn" Click="StreamIn_Click" />
<RadioButton Content="{strings:TranslateExtension Parameters_CAN}" x:Name="rbParametersCAN" Click="CAN_Click" />
<StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=ChannelListView, Path=GCAC_Visibility, Converter={StaticResource BoolToVisConverter}}" Margin="15,0,0,0">
<ToggleButton Content="{strings:TranslateExtension ModifyGlobalRangeCAC}" MinWidth="200"
x:Name="btnModifyGlobalRangeCAC" IsEnabled="{Binding ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}}"/>
<StackPanel Margin="15,0,0,0" Orientation="Horizontal" Visibility="{Binding IsChecked,ElementName=btnModifyGlobalRangeCAC, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="{strings:TranslateExtension GlobalRangeCAC}" />
<ComboBox SelectedItem="{Binding ElementName=ChannelListView, Path=SelectedGlobalRangeCACOption}" Grid.Column="1" MinWidth="300" HorizontalAlignment="Left"
HorizontalContentAlignment="Right" ItemsSource="{Binding ElementName=ChannelListView, Path=GlobalCACOptions}" x:Name="cbGlobalRangeCAC"
IsEnabled="{Binding ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}}" AutomationProperties.AutomationId="cb_GlobalRangeCAC"
/>
<Button Content="{strings:TranslateExtension btnApplyGlobalRangeCAC}" x:Name="btnGlobalRangeApply" Click="btnGlobalRangeApply_Click"
IsEnabled="{Binding ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}}"/>
</StackPanel>
</StackPanel>
</WrapPanel>
<!--<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">-->
<ListView Grid.Row="1" ItemsSource="{Binding SettingChannels}" AutomationProperties.AutomationId="Parameters" VirtualizingStackPanel.IsVirtualizing="True"
x:Name="ChannelSettingsListListView" GridViewColumnHeader.Click="GridViewColumnHeader_Click" Loaded="ChannelSettingsListListView_OnLoaded">
<ListView.View><!-- -->
<controls:AutoSizedGridView AutomationProperties.AutomationId="CustomChannelsListGridView">
<GridViewColumn AutomationProperties.AutomationId="GroupOrderColumn" x:Name="GroupOrderColumn">
<controls:GridViewColumnHeaderSearchable Tag="Order" HeaderTitle="{strings:TranslateExtension Order}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding GroupChannelOrder,FallbackValue='-1',StringFormat={}000}" VerticalAlignment="Center" AutomationProperties.AutomationId="ChannelOrderTextBlock"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="TestSetupOrderColumn" x:Name="TestSetupOrderColumn">
<controls:GridViewColumnHeaderSearchable Tag="Order" HeaderTitle="{strings:TranslateExtension Order}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding TestSetupOrder,FallbackValue='-1',StringFormat={}000}" VerticalAlignment="Center" AutomationProperties.AutomationId="ChannelOrderTextBlock"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="GroupColumn" x:Name="GroupColumn">
<controls:GridViewColumnHeaderSearchable Tag="GroupName" HeaderTitle="{strings:TranslateExtension Group}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock AutomationProperties.AutomationId="GroupNameTextBlock" MinWidth="200" Tag="GroupName" Text="{Binding GroupName}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserCodeColumn" x:Name="UserCodeColumn" Width="{Binding ShowUserCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="UserCode" HeaderTitle="{strings:TranslateExtension UserCode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock MinWidth="200" AutomationProperties.AutomationId="UserCodeTextBlock" Tag="UserCode" Text="{Binding UserCode}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserChannelNameColumn" x:Name="UserChannelNameColumn"
Width="{Binding ShowUserCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="UserChannelName" HeaderTitle="{strings:TranslateExtension UserChannelName}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding UserChannelName}" AutomationProperties.AutomationId="UserChannelNameTextBlock" MinWidth="200" Tag="UserChannelName"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ChannelNameColumn" x:Name="ChannelNameColumn"
Width="{Binding ChannelNamesOnly, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="UserChannelName" HeaderTitle="{strings:TranslateExtension ChannelName}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding UserChannelName}" AutomationProperties.AutomationId="ChannelNameTextBlock" MinWidth="200" Tag="UserChannelName"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ISOCodeColumn" x:Name="ISOCodeColumn"
Width="{Binding ShowISOCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="ISOCode" HeaderTitle="{strings:TranslateExtension ISOCode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding IsoCode}" MinWidth="200" AutomationProperties.AutomationId="ISOCodeTextBlock" Tag="ISOCode"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ISOChannelNameColumn" x:Name="ISOChannelNameColumn"
Width="{Binding ShowISOCodes, Converter={StaticResource BooleanToWidthConverter}}">
<controls:GridViewColumnHeaderSearchable Tag="ISOChannelName" HeaderTitle="{strings:TranslateExtension ISOChannelName}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding IsoChannelName}" AutomationProperties.AutomationId="ISOChannelNameTextBlock" MinWidth="200" Tag="ISOChannelName"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SensorColumn" >
<controls:GridViewColumnHeaderSearchable Tag="Sensor" HeaderTitle="{strings:TranslateExtension Sensor}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<Label Visibility="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolToVisConverter}}">
<Hyperlink Click="Hyperlink_Click" IsEnabled="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolConverter}}">
<TextBlock Text="{Binding Sensor}" AutomationProperties.AutomationId="SensorTextBlock" />
</Hyperlink>
</Label>
<TextBlock Text="{Binding Sensor}" AutomationProperties.AutomationId="SensorTextBlock" Visibility="{Binding EmbeddedSensor, Converter={StaticResource BoolToVisConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="RangeColumn" x:Name="AnalogRangeColumn" >
<controls:GridViewColumnHeaderSearchable Tag="Range" HeaderTitle="{strings:TranslateExtension AnalogParameters_Range}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<TextBlock Text="{strings:TranslateExtension Table_NA}" VerticalAlignment="Center"
Visibility="{Binding NonRangeModifiableSensor, Converter={StaticResource BoolToVisConverter}}" />
<xctk:DoubleUpDown AutomationProperties.AutomationId="AnalogParameters_Range" Minimum=".1" FormatString="N2" Value="{Binding Range}"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsRangeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
<ComboBox AutomationProperties.AutomationId="AnalogParameters_RangeLowG" HorizontalAlignment="Left"
ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableRangesLowG}" SelectedItem="{Binding RangeLowG}"
Visibility="{Binding RangeModifiableSensorLowG, Converter={StaticResource BoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsRangeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
LostFocus="RangeLowG_LostFocus"
/>
<ComboBox AutomationProperties.AutomationId="AnalogParameters_RangeARS" HorizontalAlignment="Left"
ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableRangesARS}" SelectedItem="{Binding Range}"
Visibility="{Binding RangeModifiableSensorARS, Converter={StaticResource BoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsRangeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
LostFocus="RangeARS_LostFocus"/>
<xctk:DoubleUpDown AutomationProperties.AutomationId="AnalogParameters_RangeVoltageInsert" Minimum=".1" FormatString="N2" Value="{Binding Range}"
Visibility="{Binding VoltageInsertionSensor, Converter={StaticResource BoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsRangeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CapacityColumn" x:Name="AnalogCapacityColumn">
<controls:GridViewColumnHeaderSearchable Tag="Capacity" HeaderTitle="{strings:TranslateExtension AnalogParameters_Capacity}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<TextBlock Text="{Binding EmbeddedCapacityDisplay}" VerticalAlignment="Center"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource BoolToVisConverter}}" />
<TextBlock AutomationProperties.AutomationId="AnalogParameters_Capacity" Visibility="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolToVisConverter}}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource NumericStringFormatConverter}" FallbackValue="'Capacity'">
<Binding Path="Capacity" />
<Binding Path="DataContext.CapacityFormat" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListView}}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SensitivityColumn" x:Name="AnalogSensitivityColumn">
<controls:GridViewColumnHeaderSearchable Tag="Sensitivity" HeaderTitle="{strings:TranslateExtension AnalogParameters_Sensitivity}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock AutomationProperties.AutomationId="AnalogParameters _Sensitivity" Text="{Binding Sensitivity}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UnitsColumn" x:Name="AnalogUnitsColumn">
<controls:GridViewColumnHeaderSearchable Tag="Units" HeaderTitle="{strings:TranslateExtension AnalogParameters_Units}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBlock AutomationProperties.AutomationId="AnalogParameters_Units" Text="{Binding Units}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CFCColumn" x:Name="AnalogCFCColumn">
<controls:GridViewColumnHeaderSearchable Tag="FilterClass" HeaderTitle="{strings:TranslateExtension AnalogParameters_CFC}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="AnalogParameters_CFC" DisplayMemberPath="FilterName" ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableCFC}"
HorizontalAlignment="Left" SelectedItem="{Binding FilterClass}" MinWidth="125"
BorderThickness="2.0" BorderBrush="{Binding IsFilterClassDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="PolarityColumn" x:Name="AnalogPolarityColumn">
<controls:GridViewColumnHeaderSearchable Tag="Polarity" HeaderTitle="{strings:TranslateExtension AnalogParameters_Polarity}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="AnalogParameters_Polarity" HorizontalAlignment="Left"
ItemsSource="{Binding ElementName=ChannelListView, Path=AvailablePolarity}" SelectedItem="{Binding Polarity}"
BorderThickness="2.0" BorderBrush="{Binding IsPolarityDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
<!--BorderBrush="{Binding PolarityBorderBrushColor}" BorderThickness="2.0"/>-->
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ZeroMethodColumn" x:Name="AnalogZeroMethodColumn">
<controls:GridViewColumnHeaderSearchable Tag="ZeroMethod" HeaderTitle="{strings:TranslateExtension AnalogParameters_ZeroMethod}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<!--FB16269 Show user setting but lock it rather than hide it if NonLinear-->
<ComboBox AutomationProperties.AutomationId="AnalogParameters_ZeroMethod" HorizontalAlignment="Left" MinWidth="125"
ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableZeroMethodEmbeddedSensor}" SelectedItem="{Binding ZeroMethod}"
IsEnabled="{Binding NonLinear, Converter={StaticResource InverseBoolConverter}}"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource BoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsZeroMethodDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
<ComboBox AutomationProperties.AutomationId="AnalogParameters_ZeroMethod" HorizontalAlignment="Left" MinWidth="125"
ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableZeroMethod}" SelectedItem="{Binding ZeroMethod}"
IsEnabled="{Binding NonLinearAndNotPolynomial, Converter={StaticResource InverseBoolConverter}}"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsZeroMethodDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ZeroMethodColumn" x:Name="AnalogZeroMethodStartColumn">
<controls:GridViewColumnHeaderSearchable Tag="ZeroMethodStart" HeaderTitle="{strings:TranslateExtension AnalogParameters_ZeroMethodStart}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<TextBlock Text="{strings:TranslateExtension Not_Applicable}" VerticalAlignment="Center"
Visibility="{Binding ZeroMethod, Converter={StaticResource InverseEnumVisibilityConverter}, ConverterParameter={x:Static sensors:ZeroMethodType.AverageOverTime}}" />
<xctk:DoubleUpDown AutomationProperties.AutomationId="AnalogParameters_ZeroMethodStart"
FormatString="F5" Value="{Binding ZeroMethodStart}" Visibility="{Binding ZeroMethod,
Converter={StaticResource EnumVisibilityConverter}, ConverterParameter={x:Static sensors:ZeroMethodType.AverageOverTime}}"
BorderThickness="2.0" BorderBrush="{Binding IsZeroMethodStartDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ZeroMethodColumn" x:Name="AnalogZeroMethodEndColumn">
<controls:GridViewColumnHeaderSearchable Tag="ZeroMethodEnd" HeaderTitle="{strings:TranslateExtension AnalogParameters_ZeroMethodEnd}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<TextBlock Text="{strings:TranslateExtension Not_Applicable}" VerticalAlignment="Center"
Visibility="{Binding ZeroMethod, Converter={StaticResource InverseEnumVisibilityConverter}, ConverterParameter={x:Static sensors:ZeroMethodType.AverageOverTime}}" />
<xctk:DoubleUpDown AutomationProperties.AutomationId="AnalogParameters_ZeroMethodEnd"
FormatString="F5" Value="{Binding ZeroMethodEnd}" Visibility="{Binding ZeroMethod,
Converter={StaticResource EnumVisibilityConverter}, ConverterParameter={x:Static sensors:ZeroMethodType.AverageOverTime}}"
BorderThickness="2.0" BorderBrush="{Binding IsZeroMethodEndDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserValue1Column" x:Name="AnalogUserValue1Column" >
<controls:GridViewColumnHeaderSearchable Tag="UserValue1" HeaderTitle="{strings:TranslateExtension AnalogParameters_UserValue1}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox AutomationProperties.AutomationId="AnalogParameters_UserValue1" Width="90" MaxWidth="90" MinWidth="90" Text="{Binding UserValue1}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserValue2Column" x:Name="AnalogUserValue2Column" >
<controls:GridViewColumnHeaderSearchable Tag="UserValue2" HeaderTitle="{strings:TranslateExtension AnalogParameters_UserValue2}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox AutomationProperties.AutomationId="AnalogParameters_UserValue2" Width="90" MaxWidth="90" MinWidth="90" Text="{Binding UserValue2}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UserValue3Column" x:Name="AnalogUserValue3Column" >
<controls:GridViewColumnHeaderSearchable Tag="UserValue3" HeaderTitle="{strings:TranslateExtension AnalogParameters_UserValue3}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox AutomationProperties.AutomationId="AnalogParameters_UserValue3" Width="90" MaxWidth="90" MinWidth="90" Text="{Binding UserValue3}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="InitialOffsetColumn" x:Name="AnalogInitialOffsetColumn" >
<controls:GridViewColumnHeaderSearchable Tag="InitialOffset" HeaderTitle="{strings:TranslateExtension AnalogParameters_InitialOffset}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<Grid IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<TextBlock Text="{strings:TranslateExtension Table_NA}" VerticalAlignment="Center"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource BoolToVisConverter}}" />
<ComboBox AutomationProperties.AutomationId="AnalogParameters_InitialOffset" Width="90" MaxWidth="90" MinWidth="90"
ItemsSource="{Binding AvailableInitialOffsets}" SelectedItem="{Binding InitialOffset}"
Visibility="{Binding EmbeddedSensor, Converter={StaticResource InverseBoolToVisConverter}}"
BorderThickness="2.0" BorderBrush="{Binding IsInitialOffsetDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"/>
</Grid>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- http://manuscript.dts.local/f/cases/29760/Implement-ACCoupleEnable-for-TSR-AIR -->
<GridViewColumn AutomationProperties.AutomationId="ACCouplingEnable" x:Name="AnalogACCouplingEnableColumn"
Header="{strings:Translate AnalogParameter_ACCouplingEnable}">
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<CheckBox AutomationProperties.AutomationId="AnalogParameters_ACCouplingEnable"
IsChecked="{Binding ACCouplingEnabled}" Click="ACCouplingEnable_Click"
Visibility="{Binding IsTSRAIRLowG, Converter={StaticResource BoolToVisConverter}}" >
<CheckBox.IsEnabled>
<MultiBinding Converter="{StaticResource BooleanOrMultiConverter}">
<Binding Path="ViewDbVersion" ElementName="ChannelListView" Converter="{StaticResource GreaterThanConverter}" ConverterParameter="{StaticResource MIN_DB_VERSION_AC_COUPLING}" />
<Binding Path="DataContext.ReadOnlyParametersMode" Converter="{StaticResource InverseBoolConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListView}}" />
</MultiBinding>
</CheckBox.IsEnabled>
</CheckBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="InputModeColumn" x:Name="DigitalInInputModeColumn">
<controls:GridViewColumnHeaderSearchable Tag="InputMode" HeaderTitle="{strings:TranslateExtension DigitalInParameters_InputMode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="DigitalInParameters_InputMode" HorizontalAlignment="Left" Width="180"
ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableDigitalInputModes}" SelectedItem="{Binding DigitalInputMode}"
BorderThickness="2.0" BorderBrush="{Binding IsDigitalInputModeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="DefaultValueColumn" x:Name="DigitalInDefaultValueColumn">
<controls:GridViewColumnHeaderSearchable Tag="DefaultValue" HeaderTitle="{strings:TranslateExtension DigitalInParameters_DefaultValue}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox Text="{Binding DefaultValue, Mode=TwoWay}" AutomationProperties.AutomationId="DigitialInParameters_DefaultValue"
BorderThickness="2.0" BorderBrush="{Binding IsDefaultValueDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="ActiveValueColumn" x:Name="DigitalInActiveValueColumn">
<controls:GridViewColumnHeaderSearchable Tag="ActiveValue" HeaderTitle="{strings:TranslateExtension DigitalInParameters_ActiveValue}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox Text="{Binding ActiveValue, Mode=TwoWay}" AutomationProperties.AutomationId="DigitalInParameters_ActiveValue"
BorderThickness="2.0" BorderBrush="{Binding IsActiveValueDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="OutputModeColumn" x:Name="DigitalOutOutputModeColumn">
<controls:GridViewColumnHeaderSearchable Tag="OutputMode" HeaderTitle="{strings:TranslateExtension DigitalOutParameters_OutputMode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox HorizontalAlignment="Left" ItemsSource="{Binding ElementName=ChannelListView, Path=AvailableDigitalOutputModes}"
SelectedItem="{Binding DigitalOutputMode}" Width="180" AutomationProperties.AutomationId="DigitalOutParameters_OutputMode"
BorderThickness="2.0" BorderBrush="{Binding IsDigitalOutputModeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="OutputDelayColumn" x:Name="DigitalOutDelayColumn">
<controls:GridViewColumnHeaderSearchable Tag="OutputDelay" HeaderTitle="{strings:TranslateExtension DigitalOutParameters_Delay}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<xctk:DoubleUpDown Value="{Binding DigitalOutDelay}" FormatString="N2" AutomationProperties.AutomationId="DigitalOutParameters_Delay"
Minimum="{StaticResource DIGITALOUT_DELAY_MIN}" Increment=".1"
BorderThickness="2.0" BorderBrush="{Binding IsDigitalOutDelayDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="OutputLimitDurationColumn" x:Name="DigitalOutLimitDurationColumn">
<controls:GridViewColumnHeaderSearchable Tag="OutputLimitDuration" HeaderTitle="{strings:TranslateExtension DigitalOutParameters_LimitDuration}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<CheckBox IsChecked="{Binding DigitalOutLimitDuration}" AutomationProperties.AutomationId="DigitalOutParameters_LimitDuration"
BorderThickness="2.0" BorderBrush="{Binding IsDigitalOutLimitDurationDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="OutputDurationColumn" x:Name="DigitalOutDurationColumn">
<controls:GridViewColumnHeaderSearchable Tag="OutputDuration" HeaderTitle="{strings:TranslateExtension DigitalOutParameters_Duration}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<xctk:DoubleUpDown Value="{Binding DigitalOutDuration}" FormatString="N1" AutomationProperties.AutomationId="DigitalOutParameters_Duration"
Visibility="{Binding DigitalOutLimitDuration, Converter={StaticResource BoolToVisConverter}}" Increment=".1" Maximum="{Binding DigitalOutDurationMax}"
BorderThickness="2.0" BorderBrush="{Binding IsDigitalOutDurationDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SquibFireModeColumn" x:Name="SquibFireModeColumn">
<controls:GridViewColumnHeaderSearchable Tag="SquibFireMode" HeaderTitle="{strings:TranslateExtension SquibParameters_FireMode}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="SquibParameters_FireMode" HorizontalAlignment="Left" Width="150"
ItemsSource="{Binding ElementName=ChannelListView,Path=AvailableSquibFireModes}" SelectedItem="{Binding SquibFireMode}"
BorderThickness="2.0" BorderBrush="{Binding IsSquibFireModeDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SquibDelayColumn" x:Name="SquibDelayColumn">
<controls:GridViewColumnHeaderSearchable Tag="SquibDelay" HeaderTitle="{strings:TranslateExtension SquibParameters_Delay}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<xctk:DoubleUpDown Value="{Binding SquibDelay}" FormatString="N2" AutomationProperties.AutomationId="SquibParameters_Delay" Width="100" Increment=".1"
Minimum="{StaticResource SQUIB_DELAY_MIN}" Maximum="{StaticResource SQUIB_DELAY_MAX}" Watermark="{strings:TranslateExtension EnterValue}"
BorderThickness="2.0" BorderBrush="{Binding IsSquibDelayDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SquibLimitDurationColumn" x:Name="SquibLimitDurationColumn">
<controls:GridViewColumnHeaderSearchable Tag="SquibLimitDuration" HeaderTitle="{strings:TranslateExtension SquibParameters_LimitDuration}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<CheckBox IsChecked="{Binding SquibLimitDuration}" AutomationProperties.AutomationId="SquibParameters_LimitDuration"
BorderThickness="2.0" BorderBrush="{Binding IsSquibLimitDurationDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SquibDurationColumn" x:Name="SquibDurationColumn">
<controls:GridViewColumnHeaderSearchable Tag="SquibDuration" HeaderTitle="{strings:TranslateExtension SquibParameters_Duration}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<xctk:DoubleUpDown Value="{Binding SquibDuration}" FormatString="N1" AutomationProperties.AutomationId="SquibParameters_Duration"
Minimum="{StaticResource SQUIB_DURATION_MIN}" Maximum="{StaticResource SQUIB_DURATION_MAX}"
Visibility="{Binding SquibLimitDuration, Converter={StaticResource BoolToVisConverter}}" Increment=".1"
BorderThickness="2.0" BorderBrush="{Binding IsSquibDurationDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="SquibCurrentColumn" x:Name="SquibCurrentColumn">
<controls:GridViewColumnHeaderSearchable Tag="SquibCurrent" HeaderTitle="{strings:TranslateExtension SquibParameters_Current}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<xctk:DoubleUpDown Value="{Binding SquibCurrent}" FormatString="N2" AutomationProperties.AutomationId="SquibParameters_Current"
Minimum="{StaticResource SQUIB_CURRENT_LOW}" Maximum="{StaticResource SQUIB_CURRENT_HIGH}"
Visibility="{Binding IsConstantCurrent, Converter={StaticResource BoolToVisConverter}}" Increment=".1"
BorderThickness="2.0" BorderBrush="{Binding IsSquibCurrentDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UartBaudRateColumn" x:Name="UartBaudRateColumn">
<controls:GridViewColumnHeaderSearchable Tag="UartBaudRate" HeaderTitle="{strings:TranslateExtension UartParameters_BaudRate}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox ItemsSource="{x:Static constants:EmbeddedSensors.BAUD_RATES}" BorderThickness="2.0" BorderBrush="{Binding IsUartBaudRateDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
IsEditable="True">
<ComboBox.Text>
<Binding Path="UartBaudRate" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnNotifyDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<validators:UARTBAUDRateValidator />
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UartDataBitsColumn" x:Name="UartDataBitsColumn">
<controls:GridViewColumnHeaderSearchable Tag="UartDataBits" HeaderTitle="{strings:TranslateExtension UartParameters_DataBits}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<xctk:DoubleUpDown Value="{Binding UartDataBits}" FormatString="N0" AutomationProperties.AutomationId="UartParameters_DataBits"
ClipValueToMinMax="True" Increment="1" Minimum="{StaticResource UART_DATA_BITS_MIN}" Maximum="{StaticResource UART_DATA_BITS_MAX}"
BorderThickness="2.0" BorderBrush="{Binding IsUartDataBitsDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UartStopBitsColumn" x:Name="UartStopBitsColumn">
<controls:GridViewColumnHeaderSearchable Tag="UartStopBits" HeaderTitle="{strings:TranslateExtension UartParameters_StopBits}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="UartParameters_StopBits" HorizontalAlignment="Left" Width="150"
ItemsSource="{Binding ElementName=ChannelListView,Path=AvailableUartStopBits}" SelectedItem="{Binding UartStopBits}"
BorderThickness="2.0" BorderBrush="{Binding IsUartStopBitsDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="UartParityColumn" x:Name="UartParityColumn">
<controls:GridViewColumnHeaderSearchable Tag="UartParity" HeaderTitle="{strings:TranslateExtension UartParameters_Parity}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="UartParameters_Parity" HorizontalAlignment="Left" Width="150"
ItemsSource="{Binding ElementName=ChannelListView,Path=AvailableUartParities}" SelectedItem="{Binding UartParity}"
BorderThickness="2.0" BorderBrush="{Binding IsUartParityDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!--FB 30486 Remove option from UI-->
<GridViewColumn AutomationProperties.AutomationId="UartDataFormatColumn" x:Name="UartDataFormatColumn">
<controls:GridViewColumnHeaderSearchable Tag="UartDataFormat" HeaderTitle="{strings:TranslateExtension UartParameters_DataFormat}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="UartParameters_DataFormat" HorizontalAlignment="Left" Width="150"
ItemsSource="{Binding ElementName=ChannelListView,Path=AvailableUartDataFormats}" SelectedItem="{Binding UartDataFormat}"
BorderThickness="2.0" BorderBrush="{Binding IsUartDataFormatDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamInUDPAddressColumn" x:Name="StreamInUDPAddressColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamInUDPAddress" HeaderTitle="{strings:TranslateExtension StreamInParameters_UDPAddress}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<TextBox Text="{Binding StreamInUDPAddress, Mode=TwoWay}" AutomationProperties.AutomationId="StreamInParameters_UDPAddress"
BorderThickness="2.0" BorderBrush="{Binding IsStreamInUDPAddressDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutUDPProfileColumn" x:Name="StreamOutUDPProfileColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutUDPProfile" HeaderTitle="{strings:TranslateExtension StreamOutParameters_StreamProfile}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox AutomationProperties.AutomationId="StreamOutParameters_StreamProfile" HorizontalAlignment="Left" MinWidth="180" Width="Auto"
ItemsSource="{Binding ElementName=ChannelListView,Path=AvailableStreamOutUDPProfiles}" SelectedItem="{Binding StreamOutUDPProfile}"
BorderThickness="2.0" BorderBrush="{Binding IsStreamOutUDPProfileDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutUDPAddressColumn" x:Name="StreamOutUDPAddressColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutUDPAddress" HeaderTitle="{strings:TranslateExtension StreamOutParameters_UDPAddress}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<TextBox Text="{Binding StreamOutUDPAddress, Mode=TwoWay}" AutomationProperties.AutomationId="StreamOutParameters_UDPAddress"
BorderThickness="2.0" BorderBrush="{Binding IsStreamOutUDPAddressDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
Visibility="{Binding IsUARTStream, Converter={StaticResource InverseBoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsUARTStream, Converter={StaticResource BoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutUDPTimeChannelIdColumn" x:Name="StreamOutUDPTimeChannelIdColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutUDPTimeChannelId" HeaderTitle="{strings:TranslateExtension StreamOutParameters_TimeChannelId}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding StreamOutUDPTimeChannelId}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_TimeChannelId"
ClipValueToMinMax="True" Increment="1" Minimum="{StaticResource STREAMOUT_TIMECHANNELID_MIN}" Maximum="{StaticResource STREAMOUT_TIMECHANNELID_MAX}"
BorderThickness="2.0" BorderBrush="{Binding IsStreamOutUDPTimeChannelIdDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
Visibility="{Binding IsCH10, Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsCH10, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutUDPDataChannelIdColumn" x:Name="StreamOutUDPDataChannelIdColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutUDPDataChannelId" HeaderTitle="{strings:TranslateExtension StreamOutParameters_DataChannelId}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding StreamOutUDPDataChannelId}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_DataChannelId"
ClipValueToMinMax="True" Increment="1" Minimum="{StaticResource STREAMOUT_DATACHANNELID_MIN}" Maximum="{StaticResource STREAMOUT_DATACHANNELID_MAX}"
BorderThickness="2.0" BorderBrush="{Binding IsStreamOutUDPDataChannelIdDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}">
<xctk:DoubleUpDown.Visibility>
<MultiBinding Converter="{StaticResource BooleanOrToVisibilityMultiConverter}">
<Binding Path="IsCH10" />
<Binding Path="IsUARTStream" />
</MultiBinding>
</xctk:DoubleUpDown.Visibility>
</xctk:DoubleUpDown>
<TextBlock Text="{strings:TranslateExtension Table_NA}">
<TextBlock.Visibility>
<MultiBinding Converter="{StaticResource BooleanOrToVisibilityMultiConverter}" ConverterParameter="False">
<Binding Path="IsCH10" />
<Binding Path="IsUARTStream" />
</MultiBinding>
</TextBlock.Visibility>
</TextBlock>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutIRIGTimeDataPacketIntervalMsColumn" x:Name="StreamOutIRIGTimeDataPacketIntervalMsColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutIRIGTimeDataPacketIntervalMs" HeaderTitle="{strings:TranslateExtension StreamOutParameters_IRIGTimeDataPacketIntervalMs}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<StackPanel Orientation="Horizontal" Visibility="{Binding IsCH10, Converter={StaticResource BoolToVisConverter}}">
<CheckBox Content="{strings:TranslateExtension IntervalOn}" IsChecked="{Binding StreamOutIRIGTimeDataPacketIntervalMs, Converter={StaticResource GreaterThanConverter}, ConverterParameter={StaticResource IntervalOnBound}, Mode=OneWay}"
Click="TimePacketIntervalOn_Click"
/>
<xctk:DoubleUpDown Value="{Binding StreamOutIRIGTimeDataPacketIntervalMs}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_DataChannelId"
ClipValueToMinMax="True" Increment="1" Minimum="{StaticResource STREAMOUT_IRIG_TDP_MIN}" Maximum="{StaticResource STREAMOUT_IRIG_TDP_MAX}"
BorderThickness="2.0" BorderBrush="{Binding IsStreamOutIRIGTimeDataPacketIntervalMsDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
Visibility="{Binding StreamOutIRIGTimeDataPacketIntervalMs, Converter={StaticResource InterveralToVisConverter}, ConverterParameter={StaticResource IntervalOnBound}}"
/>
</StackPanel>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsCH10, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutTMATSIntervalMsColumn" x:Name="StreamOutTMATSIntervalMsColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutTMATSIntervalMs" HeaderTitle="{strings:TranslateExtension StreamOutParameters_TMATSIntervalMs}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<StackPanel Orientation="Horizontal" Visibility="{Binding IsIENA, Converter={StaticResource InverseBoolToVisConverter}}"
IsEnabled="{Binding ElementName=ChannelListView, Path=DbVersion, Converter={StaticResource GreaterThanConverter}, ConverterParameter={StaticResource TMATSIntervalDbVesion}}">
<CheckBox Content="{strings:TranslateExtension IntervalOn}" IsChecked="{Binding StreamOutTMATSIntervalMs, Converter={StaticResource GreaterThanConverter},ConverterParameter={StaticResource IntervalOnBound},Mode=OneWay}"
Click="TMATSIntervalON_Click"
/>
<xctk:DoubleUpDown Value="{Binding StreamOutTMATSIntervalMs}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_TMATSIntervalMs"
ClipValueToMinMax="True" Increment="1" Minimum="{StaticResource STREAMOUT_TMAT_INTERVAL_MIN}" Maximum="{StaticResource STREAMOUT_TMAT_INTERVAL_MAX}"
BorderThickness="2.0" BorderBrush="{Binding IsStreamOutTMATSIntervalMsDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
Visibility="{Binding StreamOutTMATSIntervalMs, Converter={StaticResource InterveralToVisConverter}, ConverterParameter={StaticResource IntervalOnBound}}"
/>
</StackPanel>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsIENA, Converter={StaticResource BoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- TMNS Columns -->
<GridViewColumn AutomationProperties.AutomationId="StreamOutSubFrameIDColumn" x:Name="StreamOutSubFrameIDColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutSubFrameIdColumn" HeaderTitle="{strings:TranslateExtension StreamOutParameters_TMNS_SubFrameId}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding TMNS_SubFrameId}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_TMNS_SubFrameId"
ClipValueToMinMax="True" Increment="1" Minimum="0" Maximum="65535"
BorderThickness="2.0" Visibility="{Binding IsTMNS,Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsTMNS, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutMessageIDColumn" x:Name="StreamOutMessageIDColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutMessageIdColumn" HeaderTitle="{strings:TranslateExtension StreamOutParameters_TMNS_MessageId}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding TMNS_MsgId}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_TMNS_MessageId"
ClipValueToMinMax="True" Increment="1" Minimum="0" Maximum="65535"
BorderThickness="2.0" Visibility="{Binding IsTMNS, Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsTMNS, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutMinorPerMajorColumn" x:Name="StreamOutMinorPerMajorColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutMinorPerMajorColumn" HeaderTitle="{strings:TranslateExtension StreamOutParameters_TMNS_MinorPerMajor}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding TMNS_MinorPerMajor}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_TMNS_MinorPerMajor"
ClipValueToMinMax="True" Increment="1" Minimum="0" Maximum="65535"
BorderThickness="2.0" Visibility="{Binding IsTMNS, Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsTMNS, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutTMATSPortColumn" x:Name="StreamOutTMATSPortColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutTMATSPortColumn" HeaderTitle="{strings:TranslateExtension StreamOutParameters_TMNS_TMATSPort}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding TMNS_TMATSPort}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_TMNS_TMATSPort"
ClipValueToMinMax="True" Increment="1" Minimum="0" Maximum="65535"
BorderThickness="2.0" Visibility="{Binding IsTMNS, Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsTMNS, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- IENA columns -->
<GridViewColumn AutomationProperties.AutomationId="StreamOutIENASourcePortColumn" x:Name="StreamOutIENASourcePortColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutIENASourcePortColumn" HeaderTitle="{strings:TranslateExtension StreamOutParameters_IENA_SourcePort}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding IENA_SourcePort}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_IENA_SourcePort"
ClipValueToMinMax="True" Increment="1" Minimum="0" Maximum="65535"
BorderThickness="2.0" Visibility="{Binding IsIENA, Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsIENA, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="StreamOutIENAKeyColumn" x:Name="StreamOutIENAKeyColumn">
<controls:GridViewColumnHeaderSearchable Tag="StreamOutIENAKeyColumn" HeaderTitle="{strings:TranslateExtension StreamOutParameters_IENA_Key}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<StackPanel IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" >
<xctk:DoubleUpDown Value="{Binding IENA_Key}" FormatString="N0" AutomationProperties.AutomationId="StreamOutParameters_IENA_Key"
ClipValueToMinMax="True" Increment="1" Minimum="0" Maximum="65535"
BorderThickness="2.0" Visibility="{Binding IsIENA, Converter={StaticResource BoolToVisConverter}}"/>
<TextBlock Text="{strings:TranslateExtension Table_NA}" Visibility="{Binding IsIENA, Converter={StaticResource InverseBoolToVisConverter}}"/>
</StackPanel>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CanIsFDColumn" x:Name="CanIsFDColumn">
<controls:GridViewColumnHeaderSearchable Tag="CanIsFD" HeaderTitle="{strings:TranslateExtension CanParameters_IsFD}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<CheckBox IsChecked="{Binding CanIsFD}" AutomationProperties.AutomationId="CanIsFDColumn"
BorderThickness="2.0" BorderBrush="{Binding IsCanIsCanFDDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CanArbBaseBitrateColumn" x:Name="CanArbBaseBitrateColumn">
<controls:GridViewColumnHeaderSearchable Tag="CanArbBaseBitrate" HeaderTitle="{strings:TranslateExtension CanParameters_ArbBaseBitrate}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox ItemsSource="{Binding ArbBaseBitrate_Values}" BorderThickness="2.0" BorderBrush="{Binding IsCanArbBaseBitrateDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
IsEditable="True">
<ComboBox.Text>
<Binding Path="CanArbBaseBitrate" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnNotifyDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<!--<validators:CANArbBaseBitrateValidator />-->
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CanArbBaseSJWColumn" x:Name="CanArbBaseSJWColumn">
<controls:GridViewColumnHeaderSearchable Tag="CanArbBaseSJW" HeaderTitle="{strings:TranslateExtension CanParameters_ArbBaseSJW}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox ItemsSource="{Binding ArbBaseSJW_Values}" BorderThickness="2.0" BorderBrush="{Binding IsCanArbBaseSJWDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
IsEditable="True">
<ComboBox.Text>
<Binding Path="CanArbBaseSJW" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnNotifyDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<!--<validators:CANArbBaseBitrateValidator />-->
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CanDataBitrateColumn" x:Name="CanDataBitrateColumn">
<controls:GridViewColumnHeaderSearchable Tag="CanDataBitrate" HeaderTitle="{strings:TranslateExtension CanParameters_DataBitrate}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox ItemsSource="{x:Static constants:EmbeddedSensors.DATABITRATE_VALUES}" BorderThickness="2.0" BorderBrush="{Binding IsCanArbBaseSJWDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
IsEditable="True" Visibility="{Binding CanIsFD, Converter={StaticResource BoolToVisConverter}}">
<ComboBox.Text>
<Binding Path="CanDataBitrate" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnNotifyDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<!--<validators:CANArbBaseBitrateValidator />-->
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CanDataSJWColumn" x:Name="CanDataSJWColumn">
<controls:GridViewColumnHeaderSearchable Tag="CanDataSJW" HeaderTitle="{strings:TranslateExtension CanParameters_DataSJW}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox ItemsSource="{Binding DataSJW_Values}" BorderThickness="2.0" BorderBrush="{Binding IsCanArbBaseSJWDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
IsEditable="True" Visibility="{Binding CanIsFD, Converter={StaticResource BoolToVisConverter}}">
<ComboBox.Text>
<Binding Path="CanDataSJW" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnNotifyDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<!--<validators:CANArbBaseBitrateValidator />-->
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn AutomationProperties.AutomationId="CanFileTypeColumn" x:Name="CanFileTypeColumn">
<controls:GridViewColumnHeaderSearchable Tag="CanFileType" HeaderTitle="{strings:TranslateExtension CanParameters_FileType}" Search="GridViewColumnHeaderSearchable_OnSearch" ListviewId="{Binding ListViewId}" ClickHandler="GridViewColumnHeader_Click"/>
<GridViewColumn.CellTemplate>
<ItemContainerTemplate>
<ComboBox ItemsSource="{x:Static constants:EmbeddedSensors.FILETYPE_VALUES}" BorderThickness="2.0" BorderBrush="{Binding IsCanArbBaseSJWDifferent, Converter={StaticResource BooleanToBorderBrushConverter}}"
IsEnabled="{Binding DataContext.ReadOnlyParametersMode, Converter={StaticResource InverseBoolConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
IsEditable="True">
<ComboBox.Text>
<Binding Path="CanFileType" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnNotifyDataErrors="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<!--<validators:CANArbBaseBitrateValidator />-->
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
</ItemContainerTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</controls:AutoSizedGridView>
</ListView.View>
</ListView>
<!--</ScrollViewer>-->
</Grid>
</base:BaseView>

File diff suppressed because it is too large Load Diff