XAML Binding to Sql Server - c#

I have a SQL Server DB with the following tables and relationships:
Jobs which contains many sessions.
Sessions which contains many breaks.
First of all, dont be frightened by the large amount of code posted here. The relevant parts are the highlighted parts dealing with the list, the rest is just for comparison to see where I am going wrong.
In XAML I am trying and succeeding when binding jobs. I get it to filter out the correct sessions. No problem there.
My problem is that when I try to get it to filter the breaks that belong to each session it wont work but I am using all the same principles.
I am not using (nor interested in using) Linq2Sql as it creates too many additional classes that bloat my code. I am just using direct databinding.
I have asked this question before and posted code, but I never got any reply because the code was simply too long to read in a reasonable timeframe.
My question here is, what am I doing wrong. I was with the impression that since I can successfully bind and filter sessions, then I should be able to do likewise with sessions and filter breaks. But it doesnt work.
I am getting somewhat desparate for help and appreicate any answers.
EDIT: Once again I have included code samples. I am not trying to hide the code for secrecy and copyright. It is just an exercise I am doing to learn so I wouldnt mind posting the full code. But it is very long. So I will just post the parts I think are relevant. If you want more just ask.
For those of you interested in skipping to the good part where the problems are, look under the part of the Breaks list box. The rest is just there for comparison to help you debug. There is also C# code below to help further. Again, look at the list part the rest is just for debugging.
Below is the relevant XAML
<!--Jobs List box - Works fine-->
<ListBox Name="lstJobs" DockPanel.Dock="Top"
MinWidth="150" MinHeight="200" MaxHeight="250"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionChanged="lstJobs_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
DataContext="{Binding Tables[JobDetails]}"
ItemsSource="{Binding}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" Margin="3,0,3,0">
<TextBlock Text="{Binding Path=Title}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Path=ID}"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--How Jobs listbox is bound to relevant fields in jobs table. This works fine-->
<TextBox Text="{Binding ElementName=lstJobs, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}" Name="txtJobNo" Grid.Row="1" IsEnabled="False"/>
<TextBox Text="{Binding ElementName=lstJobs, Path=SelectedItem.Title, UpdateSourceTrigger=PropertyChanged}" Name="txtJobTitle" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/>
<TextBox Text="{Binding ElementName=lstJobs, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}" Name="txtJobDesc" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" Grid.RowSpan="2"/>
<!--Sessions List box, Automatically filtered based on relationship (see last binding line). This works fine too-->
<ListBox Name="lstSessions" DockPanel.Dock="Top" MinWidth="150"
MinHeight="200" MaxHeight="220"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionChanged="lstSessions_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
DataContext="{Binding Path=Tables[JobDetails]}"
ItemsSource="{Binding Path=relJobDetailsSessionDetails}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" Margin="3,0,3,0">
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=ID}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--How Sessions listbox is bound to relevant fields in Sessions table. This works fine-->
<TextBox Name="txtSessionNo" Text="{Binding ElementName=lstSessions, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="0"/>
<TextBox Name="txtSessionTitle" Text="{Binding ElementName=lstSessions, Path=SelectedItem.Title, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3"/>
<TextBox Name="txtSessionDesc" Text="{Binding ElementName=lstSessions, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" Grid.RowSpan="2"/>
<!--Breaks List box, Should be automatically filtered (it is), but it does not change when a job or session is selected. Why?? -->
<ListBox Name="lstBreaks" MinWidth="150" MinHeight="140" MaxHeight="140"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionChanged="lstBreaks_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
DataContext="{Binding Path=Tables[SessionDetails]}"
ItemsSource="{Binding Path=relSessionDetailsBreakDetails}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" Margin="3,0,3,0">
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=ID}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--How Breaks listbox is bound to relevant fields in Breaks table. This works fine as before-->
<TextBox Name="txtBreakNo" Text="{Binding ElementName=lstBreaks, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="0"/>
<TextBox Name="txtBreakTitle" Text="{Binding ElementName=lstBreaks, Path=SelectedItem.Title, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/>
<ComboBox Name="cbxBreakType" Text="{Binding ElementName=lstBreaks, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="3"/>
Following is the C# Code behind (Once again, the highlighted part is the breaks and the rest is just for comparison, so you can skip directly to that if you like):
//Connection String
string conString = "XYZ Works ok, no prob here";
//Data Adaptors for various tables
SqlDataAdapter daJobDetails = new SqlDataAdapter();
SqlDataAdapter daSessionDetails = new SqlDataAdapter();
SqlDataAdapter daBreakDetails = new SqlDataAdapter();
//The dataset to hold all of the data
DataSet dsDataSet = new DataSet();
//Step 1: Create Connection
SqlConnection conn = new SqlConnection(conString);
//Open Connection
conn.Open();
//Load Job Details Table - works fine.
daJobDetails.SelectCommand = new SqlCommand("Select * From JobDetails", conn);
daJobDetails.Fill(dsDataSet, "JobDetails");
//Load Session Details table - works fine.
daSessionDetails.SelectCommand = new SqlCommand("SELECT * FROM SessionDetails", conn);
daSessionDetails.Fill(dsDataSet, "SessionDetails");
//Relation: JobDetails.ID = SessionDetails.JobID. - Works fine
dsDataSet.Relations.Add("relJobDetailsSessionDetails",
dsDataSet.Tables["JobDetails"].Columns["ID"],
dsDataSet.Tables["SessionDetails"].Columns["JobID"]);
//**** Possible problem code *****
//Load Break Details table - could there be something wrong here.
daBreakDetails.SelectCommand = new SqlCommand("SELECT * FROM BreakDetails", conn);
daBreakDetails.Fill(dsDataSet, "BreakDetails");
//**** Possible problem code *****
//Relation: SessionDetails.ID = BreakDetails.SessionID - Could there be something wrong here
dsDataSet.Relations.Add("relSessionDetailsBreakDetails",
dsDataSet.Tables["SessionDetails"].Columns["ID"],
dsDataSet.Tables["BreakDetails"].Columns["SessionID"]);
//Set the DataContext to the DataSet
expJobs.DataContext = dsDataSet;
//Close connection
conn.Close();

As requested, here is a full repro case.
Update: updated with the working code from your link. Looks like the answer was binding to SelectedItem => relation. Very logical, actually.
XAML:
<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>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=".5*"/>
<ColumnDefinition Width=".5*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=".33*"/>
<RowDefinition Height=".33*"/>
<RowDefinition Height=".33*"/>
</Grid.RowDefinitions>
<!--Jobs List box - Works fine-->
<ListBox Name="lstJobs" Grid.Column="0" Grid.Row="0"
MinWidth="150"
MinHeight="200"
MaxHeight="250"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionChanged="lstJobs_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=JobDetails}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" Margin="3,0,3,0">
<TextBlock Text="{Binding Path=ID}"/>
<TextBlock Text="{Binding Path=Title}"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--How Jobs listbox is bound to relevant fields in jobs table. This works fine-->
<StackPanel Orientation="Vertical" Grid.Column="1" Grid.Row="0">
<TextBox Text="{Binding ElementName=lstJobs, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}"
Name="txtJobNo" Grid.Row="1" IsEnabled="False"/>
<TextBox Text="{Binding ElementName=lstJobs, Path=SelectedItem.Title, UpdateSourceTrigger=PropertyChanged}"
Name="txtJobTitle" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/>
<TextBox Text="{Binding ElementName=lstJobs, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}"
Name="txtJobDesc" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" Grid.RowSpan="2"/>
</StackPanel>
<!--Sessions List box, Automatically filtered based on relationship (see last binding line). This works fine too -->
<ListBox Name="lstSessions" Grid.Column="0" Grid.Row="1"
DockPanel.Dock="Top"
MinWidth="150"
MinHeight="200"
MaxHeight="220"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionChanged="lstSessions_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding ElementName=lstJobs, Path=SelectedItem.relJobDetailsSessionDetails}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" Margin="3,0,3,0">
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=ID}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--How Sessions listbox is bound to relevant fields in Sessions table. This works fine-->
<StackPanel Orientation="Vertical" Grid.Column="1" Grid.Row="1">
<TextBox Name="txtSessionNo" Text="{Binding ElementName=lstSessions, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="1" Grid.Column="0"/>
<TextBox Name="txtSessionTitle" Text="{Binding ElementName=lstSessions, Path=SelectedItem.Title, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3"/>
<TextBox Name="txtSessionDesc" Text="{Binding ElementName=lstSessions, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" Grid.RowSpan="2"/>
</StackPanel>
<!--Breaks List box, Should be automatically filtered (it is), but it does not change when a job or session is selected. Why?? -->
<ListBox Name="lstBreaks" Grid.Column="0" Grid.Row="2"
MinWidth="150"
MinHeight="140"
MaxHeight="140"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionChanged="lstBreaks_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding ElementName=lstSessions, Path=SelectedItem.relSessionDetailsBreakDetails}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" Margin="3,0,3,0">
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=ID}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--How Breaks listbox is bound to relevant fields in Breaks table. This works fine as before-->
<StackPanel Orientation="Vertical" Grid.Column="1" Grid.Row="2">
<TextBox Name="txtBreakNo" DockPanel.Dock="Bottom"
Text="{Binding ElementName=lstBreaks, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="2" Grid.Column="1"/>
<TextBox Name="txtBreakTitle" DockPanel.Dock="Bottom"
Text="{Binding ElementName=lstBreaks, Path=SelectedItem.Title, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="2" Grid.Column="2"/>
<ComboBox Name="cbxBreakType" DockPanel.Dock="Bottom"
Text="{Binding ElementName=lstBreaks, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="2" Grid.Column="3"/>
</StackPanel>
</Grid>
</Window>
Code behind:
using System;
using System.Data;
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
CreateData();
this.DataContext = Data;
}
public DataSet Data { get; set; }
private void CreateData()
{
Data = new DataSet();
Data.Tables.Add(CreateJobTable());
Data.Tables.Add(CreateSessionsTable());
Data.Tables.Add(CreateBreaks());
DataRelation relation = GetJobSessionRelations();
DataRelation relation2 = GetSessionBreakRelations();
Data.Relations.AddRange(new[] {relation, relation2});
}
private DataTable CreateJobTable()
{
var jobs = new DataTable();
jobs.TableName = "JobDetails";
var col1 = new DataColumn("ID");
var col2 = new DataColumn("Title");
var col3 = new DataColumn("Description");
col1.DataType = Type.GetType("System.Int32");
col2.DataType = Type.GetType("System.String");
col3.DataType = Type.GetType("System.String");
jobs.Columns.Add(col1);
jobs.Columns.Add(col2);
jobs.Columns.Add(col3);
DataRow row = jobs.NewRow();
row["ID"] = 1;
row["Title"] = "Job 1";
row["Description"] = "Job Desc 1";
jobs.Rows.Add(row);
DataRow row2 = jobs.NewRow();
row2["ID"] = 2;
row2["Title"] = "Job 2";
row2["Description"] = "Job Desc 2";
jobs.Rows.Add(row2);
return jobs;
}
private DataTable CreateSessionsTable()
{
var sessions = new DataTable();
sessions.TableName = "SessionDetails";
var col1 = new DataColumn("ID");
var col2 = new DataColumn("Title");
var col3 = new DataColumn("Description");
var col4 = new DataColumn("JobID");
col1.DataType = Type.GetType("System.Int32");
col2.DataType = Type.GetType("System.String");
col3.DataType = Type.GetType("System.String");
col4.DataType = Type.GetType("System.Int32");
sessions.Columns.Add(col1);
sessions.Columns.Add(col2);
sessions.Columns.Add(col3);
sessions.Columns.Add(col4);
DataRow row = sessions.NewRow();
row["ID"] = 1;
row["Title"] = "Session 1";
row["Description"] = "Session Desc 1";
row["JobID"] = 1;
sessions.Rows.Add(row);
DataRow row2 = sessions.NewRow();
row2["ID"] = 2;
row2["Title"] = "Session 2";
row2["Description"] = "Session Desc 2";
row2["JobID"] = 1;
sessions.Rows.Add(row2);
DataRow row3 = sessions.NewRow();
row3["ID"] = 3;
row3["Title"] = "Session 3";
row3["Description"] = "Session Desc 3";
row3["JobID"] = 2;
sessions.Rows.Add(row3);
DataRow row4 = sessions.NewRow();
row4["ID"] = 4;
row4["Title"] = "Session 4";
row4["Description"] = "Session Desc 4";
row4["JobID"] = 2;
sessions.Rows.Add(row4);
return sessions;
}
private DataTable CreateBreaks()
{
var breaks = new DataTable();
breaks.TableName = "BreakDetails";
var col1 = new DataColumn("ID");
var col2 = new DataColumn("Title");
var col3 = new DataColumn("Description");
var col4 = new DataColumn("SessionID");
col1.DataType = Type.GetType("System.Int32");
col2.DataType = Type.GetType("System.String");
col3.DataType = Type.GetType("System.String");
col4.DataType = Type.GetType("System.Int32");
breaks.Columns.Add(col1);
breaks.Columns.Add(col2);
breaks.Columns.Add(col3);
breaks.Columns.Add(col4);
DataRow row = breaks.NewRow();
row["ID"] = 1;
row["Title"] = "Break 1";
row["Description"] = "Break Desc 1";
row["SessionID"] = 1;
breaks.Rows.Add(row);
DataRow row2 = breaks.NewRow();
row2["ID"] = 2;
row2["Title"] = "Break 2";
row2["Description"] = "Break Desc 2";
row2["SessionID"] = 2;
breaks.Rows.Add(row2);
DataRow row3 = breaks.NewRow();
row3["ID"] = 3;
row3["Title"] = "Break 3";
row3["Description"] = "Break Desc 3";
row3["SessionID"] = 3;
breaks.Rows.Add(row3);
DataRow row4 = breaks.NewRow();
row4["ID"] = 4;
row4["Title"] = "Break 4";
row4["Description"] = "Break Desc 4";
row4["SessionID"] = 4;
breaks.Rows.Add(row4);
return breaks;
}
private DataRelation GetSessionBreakRelations()
{
return new DataRelation("relJobDetailsSessionDetails", Data.Tables["JobDetails"].Columns["ID"],
Data.Tables["SessionDetails"].Columns["JobID"]);
}
private DataRelation GetJobSessionRelations()
{
var dataRelation = new DataRelation("relSessionDetailsBreakDetails", Data.Tables["SessionDetails"].Columns["ID"],
Data.Tables["BreakDetails"].Columns["SessionID"]);
return dataRelation;
}
private void lstJobs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void lstSessions_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void lstBreaks_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}

Related

Combobox SelectedItem and Binding in UWP

Currently Developing an UWP Application having troubles with comboboxes.
I am binding an ObservableCollection to a combobox (it works)
var WarehouseList = new ObservableCollection<Warehouse>(taskmag.Result);
WarehouseBox.ItemsSource = WarehouseList;
What I would like to do is to show a selecteditem when I load data into my form.
I am not using MVVM and this is my Combox XAML
<ComboBox HorizontalAlignment="Stretch" Width="400" FontSize="32" Name="WarehouseBox" Margin="20,0,0,0">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Width="Auto" Height="Auto">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding WarehouseID}" Name="MID" Visibility="Collapsed"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
I have no idea where to start from as documentation always implies MVVM or some other thing I have not implemented.
I am willing to change my items coll to List or IEnumerable if it can help solve the issue.
Any help is greatly appreciated.
Here's the full thing, let me know if it still doesn't work for you:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ComboBox x:Name="ComboBoxWarehouses">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Width="Auto" Height="Auto">
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
public MainPage()
{
this.InitializeComponent();
var items = new ObservableCollection<Warehouse>();
var item = new Warehouse() {Name = "selected"};
items.Add(new Warehouse() { Name = "not selected"});
items.Add(item);
items.Add(new Warehouse() { Name = "Another Not Selected"});
ComboBoxWarehouses.ItemsSource = items;
ComboBoxWarehouses.SelectedItem = item;
}

bind data in tabcontrol on the different label

I have a tabcontrol, each item of this tabcontrol is made with some label.
I insert manually all the information in the different label but I want to bind the information I think is more clean.
I have an entity BE this is the data that I want to bien
this is my code:
numBe.Content = BE.BE_Numero_BE;
BeDate.Content = BE.BE_Date;
Numcarnet.Content = BE.BE_Numero_carnet;
BeFourn.Content = BE.BE_Fournisseur;
BECom.Content = BE.BE_Commercial;
NumTicket.Content = BE.BE_Numero_ticket;
NumCnt.Content = BE.BE_Numero_carnet;
TypeBe.Content = BE.BE_Type_BE;
BeImm.Content = BE.BE_Immatriculation;
BeSC.Content = BE.BE_Stock_client;
NumS.Content = BE.BE_N_serie;
BeSa.Content = BE.BE_SA;
BeEx.Content = BE.BE_Exutoire;
BeNrcde.Content = BE.BE_NrCde;
I already do this but I don't know how to bind :
<TabControl x:Name="TabControlBe" HorizontalAlignment="Left" Margin="17,425,0,0" Grid.Row="1" Width="471" >
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock>BE1</TextBlock>
</StackPanel>
</TabItem.Header>
<Grid>
<Label Content="Numero Be:" Height="27" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75"/>
<Label x:Name="numBe" Content="{Binding BE_Numero}" Height="25" Margin="0,0,50,0" HorizontalAlignment="Right" Width="331" VerticalAlignment="Top" />...
Thanks for your help

ComboBox in WPF Datagrid c#

I have a DataGrid and fill it with a DataTable.
dgMitarbeiter.ItemsSource = mainController.loadDataTableMitarbeiter().DefaultView;
this is the function:
public DataTable loadDataTableMitarbeiter()
{
loadMitarbeiterList();
dtMitarbeiter.Clear();
foreach (Mitarbeiter mitarbeiter in mitarbeiterList)
{
drMitarbeiter = dtMitarbeiter.NewRow();
drMitarbeiter["ID"] = mitarbeiter.ID;
drMitarbeiter["Vorname"] = mitarbeiter.vorname;
drMitarbeiter["Nachname"] = mitarbeiter.nachname;
drMitarbeiter["Kostenstelle"] = mitarbeiter.kostenstelle.id;
drMitarbeiter["Größe Hose"] = mitarbeiter.gr_hose;
drMitarbeiter["Größe Oberteil"] = mitarbeiter.gr_oberteil;
drMitarbeiter["Gröse Schuhe"] = mitarbeiter.gr_schuhe;
drMitarbeiter["Ferial"] = mitarbeiter.ferial;
drMitarbeiter["Werk"] = mitarbeiter.werk;
drMitarbeiter["Datum"] = mitarbeiter.creationDate.ToString("dd.MM.yyyy");
dtMitarbeiter.Rows.Add(drMitarbeiter);
}
return dtMitarbeiter;
}
The Xaml:
<DataGrid x:Name="dgMitarbeiter" AlternatingRowBackground="Gainsboro" AlternationCount="2" ColumnWidth="*" HorizontalAlignment="Left" SelectedItem="{Binding SelectedItem}" Margin="10,22,0,0" VerticalAlignment="Top" Height="357" Width="731" CanUserAddRows="False" CanUserDeleteRows="False" RowEditEnding="dgMitarbeiter_RowEditEnding" Background="White" HeadersVisibility="Column"/>
I need a ComboBox for the column "Kostenstelle" but have no idea how to achieve this. Any ideas?
My answer implements an ObservableCollection. And adds this as a databinding to the ComboBox
You need a new class:
public class Kostenstellen: ObservableCollection<Kostenstelle>
{
}
And a fill Method with the following lines of code:
var kostenstellen = new Kostenstellen();
foreach mitarbeiter in mitarbeiterList
{
kostenstellen.Add(mitarbeiter.kostenstelle);
}
var cvsCombobox = new CollectionViewSource() { Source = this.operationList };
this.myCombobox.SetBinding(ItemsControl.ItemsSourceProperty, new Binding() { Source = cvsCombobox });
Now there will be only "(Kostenstelle)" as a string in the Combobox.
So you need to override the ToString() method of your Kostenstelle class
public partial class Kostenstelle
{
public override string ToString()
{
return this.ID.ToString();
}
}
HINT:
Use english variable and class names next time :)
You need to define a DataGridComboBoxColumn in your DataGrid columns, you can then bind the ItemsSource to wherever your combo box's options are located.
See here.
You can do a lot in your xaml file :) For myself I used this one lately...
In the xaml file you can now define the placement of the combobox on your page.
you can set the content by code later.
<GridView
x:Name="itemGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Items In Group"
TabIndex="1"
Grid.RowSpan="2"
Padding="120,126,120,50"
ItemsSource="{Binding}"
SelectionMode="None"
IsSwipeEnabled="false"
IsItemClickEnabled="True"
ItemClick="ItemView_ItemClick"
>
<GridView.ItemTemplate >
<DataTemplate >
<Grid Height="150" Width="480" Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,10,0,0" >
<TextBlock Text="{Binding title}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="NoWrap" FontSize="25"/>
<Line/>
<TextBlock Text="{Binding subtitle}" Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" FontSize="20" Margin="0,10,0,0" />
<Line/>
<TextBlock Text="{Binding description}" Style="{StaticResource BodyTextBlockStyle}" MaxHeight="60" FontSize="15" Margin="0,10,0,0"/>
<Button Tag="{Binding title}" Click="ItemButtonClicked" Content="Details" FontSize="15" Margin="0,10,0,0"/>
</StackPanel>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemContainerStyle>
<Style TargetType="FrameworkElement" >
<Setter Property="Margin" Value="52,0,0,2"/>
</Style>
</GridView.ItemContainerStyle>
</GridView>

Gidview item not updating

My page having city listing and searching functionality. When page first time loading, it is showing all record.
When user enter search Text and tap on search button. it is not updating gridview list. I check by placing debug point my code is working fine. but gridview list not showing updated list.
Following is my code.
XAML:
<StackPanel VerticalAlignment="Top">
<TextBlock Style="{StaticResource ListTextBlockStyle}" FontWeight="Bold" Text="{Binding Description}" />
<TextBlock Style="{StaticResource ListTextBlockStyle}" Text="{Binding Description}" />
</StackPanel>
<TextBlock Style="{StaticResource DistanceTextBlockStyle}" TextWrapping="Wrap" Text="XXXm" />
<Image Width="10" VerticalAlignment="Center" Source="ms-appx:///Assets/arrowright.png"/>
</StackPanel>
<Rectangle Height="1" Stroke="Black" StrokeThickness="0.5" Margin="0,3,0,0" />
</StackPanel>
</Border>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
<Border Grid.Row="1" Height="60" VerticalAlignment="Bottom">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBox x:Name="txtSearch" Margin="0,0,10,0" TextWrapping="Wrap" PlaceholderText="Search" VerticalAlignment="Center" Width="300" Height="50" />
<Image x:Name="imgSearch" Height="50" Width="50" Source="ms-appx:///Assets/btnSearch.png" Tapped="imgSearch_Tapped"/>
</StackPanel>
</StackPanel>
</Border>
C#:
public List<City> gs_CityList = new List<City>();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
fillCityList();
}
private void fillCityList()
{
gs_CityList.Clear();
if (string.IsNullOrEmpty(CityListManagerManager.ms_searchTxt))
{
foreach (City foCity in CityListManagerManager.ms_CityList)
{
City loCity = new City();
loCity.Description = foCity.Description.Replace("\n", "").Substring(0, 15) + "...";
loCity.longtitude = foCity.longtitude;
loCity.latitude = foCity.latitude;
loCity.Location = foCity.Location;
gs_CityList.Add(loCity);
}
}
else
{
foreach (City foCity in CityListManagerManager.ms_CityList.Where(p => p.Description.ToLower().Contains(CityListManagerManager.ms_searchTxt.ToLower())))
{
City loCity = new City();
loCity.Description = foCity.Description.Replace("\n", "").Substring(0, 15) + "...";
loCity.longtitude = foCity.longtitude;
loCity.latitude = foCity.latitude;
loCity.Location = foCity.Location;
gs_CityList.Add(loAEDPin);
}
txtSearch.Text = CityListManagerManager.ms_searchTxt;
}
if (gs_CityList.Count > 0)
{
gvCityList.DataContext = gs_CityList; // --- This binding data to gridview
}
else
MessageBox("City not found...!");
}
private void imgSearch_Tapped(object sender, TappedRoutedEventArgs e)
{
CityListManagerManager.ms_searchTxt = txtSearch.Text.Trim();
fillCityList();
}
You should try changing your List<City> into an ObservableCollection<City>, as this allows the binding to get notified about changes.
You could also think about using a CollectionViewSource as data source for the GridView and modifying its Filter property instead of re-filling the collection.

JumpList using SemanticZoom not working in Windows Phone 8.1

I followed the tutorial on this page: http://modernography.wordpress.com/2014/04/26/jumplists-in-windows-phone-8-1/
I have a collectionviewsource:
// artistdata
public CollectionViewSource ArtistList
{
get
{
var data = App.musicdata.Artists;
var groups = data.ToAlphaGroups(x => x.name);
_ArtistList = new CollectionViewSource();
_ArtistList.Source = groups; //groups is the result of using my extension methods above
_ArtistList.IsSourceGrouped = true;
return _ArtistList;
}
}
Which I bind to my XAML:
<PivotItem x:Name="artists" Margin="10,0">
<SemanticZoom Style="{StaticResource AlphaJumpListStyle}">
<SemanticZoom.ZoomedInView>
<ListView Background="Transparent" ItemsSource="{Binding ArtistList.View}" Loaded="ListviewLoaded">
<ListView.GroupStyle>
<GroupStyle HeaderTemplate="{StaticResource AlphaGroupHeaderTemplate}" HeaderContainerStyle="{StaticResource JumpListListHeaderContainerStyle}" HidesIfEmpty="True" />
</ListView.GroupStyle>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Grid.Column="1" Margin="10,5" Tapped="ArtistSelected">
<TextBlock FontFamily="Segoe WP" FontSize="22" Foreground="White" Text="{Binding name}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="{Binding ActualWidth, ElementName=parentElementName}"/>
<TextBlock FontFamily="Segoe WP" FontWeight="Light" FontSize="17" Foreground="#7FFFFFFF" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,-5,0,0">
<Run Text="{Binding amountofalbums}"/>
<Run Text="albums"/>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</SemanticZoom.ZoomedInView>
<SemanticZoom.ZoomedOutView>
<GridView ItemsSource="{Binding ArtistList.View.CollectionGroups}" Style="{StaticResource AlphaJumpListPickerStyle}" />
</SemanticZoom.ZoomedOutView>
</SemanticZoom>
</PivotItem>
It all displays correctly, I can open and close the JumpList.
BUT, when I tap on a letter in the zoomedoutview, the zoomedinview doesn't jump to that letter. Instead, it stays where it was?
I can't find the cause for this problem. Maybe the problem is that the SementicZoom is inside a Pivot?
I think the issue is caused because ListView and GridView are obtaining different instances of CollectionView. As the example shows, you should cache the first created instance.
The code should be:
public CollectionViewSource ArtistList
{
get
{
if(_ArtistList == null)
{
var data = App.musicdata.Artists;
var groups = data.ToAlphaGroups(x => x.name);
_ArtistList = new CollectionViewSource();
_ArtistList.Source = groups; //groups is the result of using my extension methods above
_ArtistList.IsSourceGrouped = true;
}
return _ArtistList;
}
}

Categories

Resources