With this application, first column in grid is check box type with its header says Select. I would like the header to show a check box also. Checking/Unchecking that check box should check or uncheck all items in the grid. How can I do that?
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Loaded="Data_Loaded" >
<Grid.RowDefinitions>
<RowDefinition Height="6*" />
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid x:Name="grEmployees" HorizontalAlignment="Left" Margin="10,10,0,0" CanUserAddRows="False" CanUserDeleteRows="False"
VerticalAlignment="Top" AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False" Grid.Row="0">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Select" Width="2*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="chkSelectedDevice" IsChecked="{Binding Path=Configure, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName, Mode=OneWay}" Width="3*" />
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName, Mode=OneWay}" Width="2*" />
<DataGridTextColumn Header="Description" Binding="{Binding Description, Mode=OneWay}" Width="5*" />
</DataGrid.Columns>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="5" Grid.Row="1" >
<Button x:Name="btnClose" Content="Close" Margin="5" Width="50" />
</StackPanel>
</Grid>
</Window>
public partial class MainWindow : Window
{
private List<Employee> Employees = null;
public MainWindow()
{
InitializeComponent();
}
private void Data_Loaded(object sender, RoutedEventArgs e)
{
Employees = new List<Employee>()
{
new Employee() { IsHardWorking = false, LastName = "Silly", FirstName = "Dude", Description= "this due is a mess" },
new Employee() { IsHardWorking = true, LastName = "Mean", FirstName = "Person", Description= "funny" },
new Employee() { IsHardWorking = false, LastName = "New", FirstName = "Friend", Description= "let her go in next round of layoffs" },
new Employee() { IsHardWorking = true, LastName = "My", FirstName = "Buddy", Description= "simply no comments" },
};
this.grEmployees.ItemsSource = Employees;
}
}
Right, so luckily there's nifty built in ways to customize all sorts of things. In this case we'll just override the default column header template with our own and plop a CheckBox in there.
<DataGridTemplateColumn.Header>
<CheckBox Name="ACheckBox"
Checked="Do_Something"
Unchecked="Do_Something_Else"/>
</DataGridTemplateColumn.Header>
Hope this helps. Cheers
<Grid Loaded="Data_Loaded" >
<Grid.RowDefinitions>
<RowDefinition Height="6*" />
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid x:Name="grEmployees" HorizontalAlignment="Left" Margin="10,10,0,0" CanUserAddRows="False" CanUserDeleteRows="False"
VerticalAlignment="Top" AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False" Grid.Row="0">
<DataGrid.Columns>
<DataGridTextColumn>
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<CheckBox></CheckBox>
<TextBlock>Test</TextBlock>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTemplateColumn Header="Select" Width="2*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="chkSelectedDevice" IsChecked="{Binding Path=Configure, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName, Mode=OneWay}" Width="3*" />
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName, Mode=OneWay}" Width="2*" />
<DataGridTextColumn Header="Description" Binding="{Binding Description, Mode=OneWay}" Width="5*" />
</DataGrid.Columns>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="5" Grid.Row="1" >
<Button x:Name="btnClose" Content="Close" Margin="5" Width="50" />
</StackPanel>
</DataGrid>
</Grid>
Related
I have more than 1000 pieces of data to display in WPF's DataGrid, and I have added a check box to the DataGrid. When multiple check boxes are selected, the selected index can be added to the specified set. The code is as follows:
XAML:
<DataGrid x:Name="textWmdg" AutoGenerateColumns="False" Grid.Row="0" VerticalAlignment="Top" ItemsSource="{Binding waterTexts}" Height="252" **EnableRowVirtualization="True"**
CanUserSortColumns="False" Margin="2,2,2,2"
VirtualizingPanel.VirtualizationMode="Standard"
CanUserResizeColumns="False" CanUserResizeRows="False" RowHeaderWidth="0"
CanUserReorderColumns="False" CanUserAddRows="False" Style="{StaticResource DataGridStyle}"VirtualizingPanel.IsVirtualizing="True" DataGrid.RowHeight="22" RowDetailsVisibilityMode="Visible" LoadingRow="TextWmdg_LoadingRow">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Select" Width="*" IsReadOnly="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<CheckBox x:Name="textSelect" Click="TextSelected_Click"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="NO." Width="*" Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Color" Width="3*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Label Width="15" BorderThickness="0.5" BorderBrush="Black" Background="{Binding TextColor}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Sign" Width="3*" Binding="{Binding Sign}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="KeyWord" Width="12*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ShowText}" TextAlignment="Left" HorizontalAlignment="Left">
<TextBlock.ToolTip>
<TextBlock Text="{Binding ShowText}" TextWrapping="Wrap"/>
</TextBlock.ToolTip>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
CS:
private void TextSelected_Click(object sender, RoutedEventArgs e)
{
deltextindex.Clear();
for (int i = 0; i < textWmdg.Items.Count; i++)
{
DataGridTemplateColumn selectcolumn = textWmdg.Columns[0] as DataGridTemplateColumn;
FrameworkElement selectment = selectcolumn.GetCellContent(textWmdg.Items[i]);
CheckBox textcheckbox = selectcolumn.CellTemplate.FindName("textSelect", selectment) as CheckBox;
if (textcheckbox.IsChecked == true)
{
deltextindex.Add(i);
}
}
}
There has been no problem before, but the display speed is very slow. Today, in order to pursue faster speed, I set the EnableRowVirtualization of DataGrid to true, and as a result, I can't get the check box normally.Tips System.ArgumentNullException.
What if I can improve the display speed and get the index of the check box correctly?
thank you!
What if you create a property IsTextSelected on your view model and bind it to CheckBox.IsChecked property?
<DataGridTemplateColumn Header="Select" Width="*" IsReadOnly="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<CheckBox IsChecked="{Binding IsTextSelected"} Click="TextSelected_Click"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Then you can check which items have IsTextSelected set to true.
private void TextSelected_Click(object sender, RoutedEventArgs e)
{
deltextindex.Clear();
for (int i = 0; i < textWmdg.Items.Count; i++)
{
var viewModel = textWmdg.Items[i] as YourViewModelType;
if (viewModel.IsTextSelected)
{
deltextindex.Add(i);
}
}
}
I'm having trouble databinding based on other properties. My combobox is working fine, but the datagrids aren't. I'm was trying to bind the window to the codebehind using
DataContext="{Binding RelativeSource={RelativeSource Self}}" so I could have design time Intellisense, but I sort of got it using x:Name:"_Window"
The model for HRRM has lots of entities, and I know that that the properties I'm trying to bind too are spelt correctly etc. But I can't figure out why the DataGrid won't show the employees. I've also ensured that the data is being placed in the observable collection, and I've tried binding the items source just to ListEmployees and SmsEmployees and nothing I've tried has worked. This is the last bit of code I have tried.
<Window x:Class="GUI.Employees.Misc.SendSms"
x:Name="_Window"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Send SMS" Height="525" Width="1000" DataContext="{Binding ElementName=_Window}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="270*" />
<ColumnDefinition Width="150" />
<ColumnDefinition Width="270*" />
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" x:Name="cmbCompany" DisplayMemberPath="Name" ItemsSource="{Binding Path=Companies, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Margin="10,10,10,0" VerticalAlignment="Top" SelectionChanged="cmbCompany_SelectionChanged"/>
<DataGrid Grid.Column="0" x:Name="dgEmployees" Margin="10,37,10,10" IsReadOnly="True" AutoGenerateColumns="False" ItemsSource="{Binding Path=ListEmployees, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window} }">
<DataGrid.Columns>
<DataGridTextColumn Header="Company" Binding="{Binding HRCo }"/>
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
<DataGridTextColumn Header="Craft" Binding="{Binding StdCraft}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid x:Name="dgSendSms" Margin="10,37,10,10" IsReadOnly="True" Grid.Column="2" ItemsSource="{Binding SmsEmployees, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window} }">
<DataGrid.Columns>
<DataGridTextColumn Header="Company" Binding="{Binding HRCo}"/>
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
<DataGridTextColumn Header="Craft" Binding="{Binding StdCraft}"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="cmdMoveAllHired" Content=">>" Margin="10,85,10,0" VerticalAlignment="Top" Grid.Column="1"
Click="cmdMoveAllHired_Click" />
<Button x:Name="cmdReturnSingleItem" Content=">" Margin="10,122,10,0" VerticalAlignment="Top"
Grid.Column="1" Click="cmdReturnSingleItem_Click" />
<Button x:Name="cmdMoveAllReturned" Content="<<" Margin="10,196,10,0" VerticalAlignment="Top"
Grid.Column="1" Click="cmdMoveAllReturned_Click" />
<Button x:Name="cmdHireSingleItem" Content="<" Margin="10,159,10,0" VerticalAlignment="Top" Grid.Column="1"
Click="cmdHireSingleItem_Click" />
<Button x:Name="cmdGenerate" Content="Generate" Grid.Column="1" Margin="10,0,10,10"
VerticalAlignment="Bottom" Click="cmdGenerate_Click" Visibility="Collapsed" />
<Button x:Name="cmdBack" Content="Back" Grid.Column="1" HorizontalAlignment="Left" Margin="10,249,0,0"
VerticalAlignment="Top" Width="130" Click="cmdBack_Click" />
<Button x:Name="cmdSendSMS" Content="Send SMS" Grid.Column="1" HorizontalAlignment="Left" Margin="10,316,0,0" VerticalAlignment="Top" Width="130" Click="cmdSendSMS_Click"/>
</Grid>
namespace GUI.Employees.Misc
{
public partial class SendSms
{
public ObservableCollection<HQCO> Companies { get; set; }
public ObservableCollection<HRRM> ListEmployees { get; set; }
private ObservableCollection<HRRM> _smsEmployees;
public ObservableCollection<HRRM> SmsEmployees {
get { return _smsEmployees; }
set { _smsEmployees = value;
}
}
public SendSms()
{
InitializeComponent();
Companies = new ObservableCollection<HQCO>(HQCO.GetActivePRCompanies());
Companies.Insert(0, new HQCO { HQCo = 0, Name = "All" });
// cmbCompany.SelectedItem = _companies.Single(x=>x.HQCo == 0);
SmsEmployees = new ObservableCollection<HRRM>();
ChangeCompany();
}
private void ChangeCompany()
{
if (((HQCO)cmbCompany.SelectedItem)?.HQCo == 0)
foreach (var co in Companies)
co.IsChecked = true;
else
foreach (var co in Companies)
if (((HQCO)cmbCompany.SelectedItem) == co)
co.IsChecked = true;
else
co.IsChecked = false;
ListEmployees = new ObservableCollection<HRRM>(Facade.GetEmployeePhoneNumbers(Companies.ToList(), false).OrderBy(x => x.SortName));
}
}
I think your problem is how you assign the DataContext of your Window. In your XAML, add a reference to the namespace so the Window can find your SendSms viewmodel, and then either assign the DataContext property in XAML (see below), or in the code-behind of your Window. If you set the DataContext this way, you shouldnt need to use RelativeSource when binding to the SendSms viewmodel, but if you want see changes, you also need to make sure the classes your observable collections are populated with implements INotifyPropertyChanged.
<Window x:Name="_Window"
xmlns:local="clr-namespace:GUI.Employees.Misc" >
<!-- set the DataContext of this Window to an instance of SendSms -->
<Window.DataContext>
<local:SendSms />
</Window.DataContext>
<DataGrid ItemsSource="{Binding ListEmployees}">
...
</DataGrid>
I don't believe your ListEmployees ItemsSource will update the DataGrid because it is not a DependencyProperty or you have not implemented INotifyPropertyChanged. It is not updating because you are assigning the property a new instance.
Instead try adding this to your constructor:
ListEmployees = new ObservableCollection<HRRM>();
And this to your ChangeCompany method:
foreach (var employee in Facade.GetEmployeePhoneNumbers(Companies.ToList(), false).OrderBy(x => x.SortName))
{
ListEmployees.Add(employee);
}
The above will actually make use of the ObservableCollection and it should then update the UI.
As WPF is not sorting Radiobox column. Can someone help?
Here is my code that display records.
XAML:
<DataGrid x:Name="DG_VendorPur" AutoGenerateColumns="False" ItemsSource="{Binding VendorProducts}" Grid.Row="7" Grid.RowSpan="4" FontFamily="Franklin Gothic Medium" FontSize="18" Background="#FFEBDCEB" AlternatingRowBackground="#FFDAE7F5" SelectionMode="Single" ColumnWidth="*" Grid.Column="5" Grid.ColumnSpan="6" SelectedCellsChanged="DG_VendorPur_SelectedCellsChanged">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Preferred" Width="90">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton x:Name="DG_isPreferred" HorizontalAlignment="Center" GroupName="Preferred" IsChecked="{Binding Path=VP_isVendorActive, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" MaxWidth="25" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn x:Name="DG_Vname" Header=" Vendor Name " MinWidth="50" Width="*" Binding="{Binding Path=VP_Vname}" FontFamily="Calibri" />
<DataGridTextColumn x:Name="DG_VItemNo" Header=" Vendor SKU# " MinWidth="50" Width="*" Binding="{Binding Path=VP_VendorSKU}" FontFamily="Calibri"/>
<DataGridTextColumn x:Name="DG_VCaseCost" Header=" Case Cost " MinWidth="50" Width="100" Binding="{Binding Path=VP_SKUcaseCost}" FontFamily="Calibri"/>
<DataGridTextColumn x:Name="DG_VQtyPerCase" Header=" Qty/Case " MinWidth="50" Width="100" Binding="{Binding Path=VP_QtyInCase}" FontFamily="Calibri"/>
</DataGrid.Columns>
</DataGrid>
XAML.CS :
sqliteCon.Open();
string Product = TB_PscanID.Text;
cmd.CommandText = "Select VP_Vname,VP_VendorSKU,VP_SKUcaseCost,VP_QtyInCase,VP_isVendorActive from VendorProducts where VP_ProductID= #WORD";
cmd.Parameters.AddWithValue("#word", Product);
cmd.Prepare();
cmd.ExecuteNonQuery();
SQLiteDataAdapter SDAdap = new SQLiteDataAdapter(cmd);
DataTable DT = new DataTable("VendorProducts");
SDAdap.Fill(DT);
DG_VendorPur.ItemsSource = DT.DefaultView;
sqliteCon.Close();
Solved: I sort the Sqlite Database in Select command : "Select VP_Vname,VP_VendorSKU,VP_SKUcaseCost,VP_QtyInCase,VP_isVendorActive from VendorProducts where VP_ProductID= #WORD ORDER BY VP_isVendorActive DESC";
I know one filter in one collection view source but when i use multiple filters in one collection source.Last filter only properly works.Please help me to do multiple filters in one collection view source.
Xaml
<Grid>
<DockPanel>
<DockPanel DockPanel.Dock="Top" Height="90">
<TextBlock VerticalAlignment="Center" Margin="0,9" DockPanel.Dock="Left" >Threshold</TextBlock>
<Slider x:Name="Confidencethreshold" Value="14" Margin="0,5" DockPanel.Dock="Left" Width="200"
Minimum="0" Maximum="50"
ValueChanged="Confidencethreshold_ValueChanged_1"
TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="False" SmallChange="1"></Slider>
<StackPanel Orientation="Horizontal" >
<RadioButton x:Name="radioFound" IsChecked="True" Content="Matches" Checked="radioFound_Checked_1" Margin="6" />
<RadioButton x:Name="radioALL" Content="ALL" Checked="radioFound_Checked_1" Margin="6"/>
</StackPanel>
</DockPanel>
<DataGrid Name="DG2" ItemsSource="{Binding}" AutoGenerateColumns="False" CanUserSortColumns="True">
<DataGrid.Columns>
<!--<mui:DataGridCheckBoxColumn Header="Silence Reduction" Binding="{Binding P1}"/>-->
<mui:DataGridTextColumn Header="Segment" Binding="{Binding sname}" IsReadOnly="True" />
<!--<mui:DataGridCheckBoxColumn Header="Trimming" Binding="{Binding trim}" />
<mui:DataGridCheckBoxColumn Header="Format Conversion" Binding="{Binding alaw}"/>
<mui:DataGridCheckBoxColumn Header="Recognition" Binding="{Binding recog}" />-->
<!--<mui:DataGridComboBoxColumn Header="Status" SelectedItemBinding="{Binding Status}" ItemsSource="{Binding Source={StaticResource myEnum}}" />-->
<mui:DataGridTextColumn Header="Key" Binding="{Binding key}" IsReadOnly="True" />
<!--<mui:DataGridTextColumn Header="Confidence" Binding="{Binding conf}" IsReadOnly="True" SortDirection="Ascending" SortMemberPath="{Binding conf}" />-->
<mui:DataGridTextColumn Header="Confidence" Binding="{Binding conf}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Grid>
And in c#
MainWindow w1 = (MainWindow)Window.GetWindow(this);
cvs = new CollectionViewSource();
cvs.Source = w1.allresults;
cvs.Filter += cvs_Filter;
DG2.DataContext = cvs;
void cvs_Filter(object sender, FilterEventArgs e)
{
KeysFound t = e.Item as KeysFound;
if (t != null)
// If filter is turned on, filter completed items.
{
if (t.conf < Confidencethreshold.Value)
e.Accepted = false;
else
{
e.Accepted = true;
}
}
}
You can use ICollectionView instead of CollectionViewSource of datagrid source. below link may help..
http://social.msdn.microsoft.com/Forums/vstudio/en-US/82cfac7c-d1f6-421c-8891-1149a90c0dd9/wpf-datagrid-one-itemssource-multiple-views-multiple-filters?forum=wpf
I have a tab-control with three tab items. each tab item has a datagrid placed on it.
and all these three datagrid's on their respective tab items is of Master-Detail-SubDetail form.
how to move from first tab item to the second tab item when a user selects a row on the Master datagrid? I have created a Model using ADO.Net entity framework to create this master-detail view.
XAML layout
<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462">
<TabItem Header="Person" Name="tabItem1">
<Grid DataContext="{StaticResource peopleViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289">
<DataGrid.Columns>
<DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Details" Name="tabItem2">
<Grid DataContext="{StaticResource peoplepersonDetailsViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="120" SelectedItem="{Binding personDetails.personStatus}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="82,18,0,0" Name="personDetailsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="172">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="personIDColumn1" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Status" Name="tabItem3">
<Grid DataContext="{StaticResource peoplepersonDetailspersonStatusViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="143" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="91,23,0,0" Name="personStatusDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="185">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn1" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn1" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="statussColumn" Binding="{Binding Path=statuss}" Header="statuss" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
</TabControl>
You could setup a EventTrigger on the DataGrid SelectionChanged event
Because EventTrigger only allowa Animation you can setup a Int32AnimationUsingKeyFrames animation to change the TabControl SelectedIndex
Trigger
<DataGrid.Triggers>
<EventTrigger RoutedEvent="DataGrid.SelectionChanged" > // SelectionChanged Event
<BeginStoryboard>
<Storyboard >
<Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex"> // set target control and target property
<SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/> // Value = TabControl Selected index you want to show
</Int32AnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataGrid.Triggers>
Here is an example:
<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462">
<TabItem Header="Person" Name="tabItem1">
<Grid DataContext="{StaticResource peopleViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289">
<DataGrid.Columns>
<DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" />
</DataGrid.Columns>
<DataGrid.Triggers>
<EventTrigger RoutedEvent="DataGrid.SelectionChanged" >
<BeginStoryboard>
<Storyboard >
<Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex">
<SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/>
</Int32AnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataGrid.Triggers>
</DataGrid>
</Grid>
</TabItem>
......
Here is my mockup
Code:
namespace WpfApplication7
{
public partial class MainWindow : Window
{
private Person _selectedPerson;
private ObservableCollection<Person> _persons = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
Items.Add(new Person { personID = "Stack" });
Items.Add(new Person { personID = "Overflow" });
}
public ObservableCollection<Person> Items
{
get { return _persons; }
set { _persons = value; }
}
public Person SelectedPerson
{
get { return _selectedPerson; }
set { _selectedPerson = value; }
}
}
public class Person
{
public string personID { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
}
}
Xaml:
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="399" Width="464" Name="UI" >
<Grid>
<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462">
<TabItem Header="Person" Name="tabItem1">
<Grid DataContext="{Binding ElementName=UI, Path=Items}" >
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289">
<DataGrid.Columns>
<DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" />
</DataGrid.Columns>
<DataGrid.Triggers>
<EventTrigger RoutedEvent="DataGrid.SelectionChanged" >
<BeginStoryboard>
<Storyboard >
<Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex">
<SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/>
</Int32AnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataGrid.Triggers>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Details" Name="tabItem2">
<Grid>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="120" SelectedItem="{Binding personDetails.personStatus}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="82,18,0,0" Name="personDetailsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="172">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="personIDColumn1" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Status" Name="tabItem3">
<Grid>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="143" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="91,23,0,0" Name="personStatusDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="185">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn1" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn1" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="statussColumn" Binding="{Binding Path=statuss}" Header="statuss" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>