WPF Load different Animation on the Main Window by Combobox Selection - vb.net

I am trying to upload in a Visual Basic 2010 WPF Mainwindow different Path animation selecting the name of the animation listed in a combobox.
So in a WPF I have my Main window containing a combobox with at this point 2 names in, and I have also Window1 and Window2 each one with a different PathAnimation.
I Do not know how load Animation 1 or Animation 2 in the Main window when the program is running.
I am a little lost

Here is a quick example that I threw together, it is using a ViewBox as a Container. See if this works for you
MainWindow.xmal
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="697" Width="697" xmlns:my="clr-namespace:WpfApplication1">
<Grid>
<Viewbox Name="TrackContainer" VerticalAlignment="Top" HorizontalAlignment="Stretch"></Viewbox>
<Button Content="Button" Height="23" HorizontalAlignment="Center" Margin="360,600,240,0" Name="Button1" VerticalAlignment="Top" Width="75" />
<ComboBox Height="23" Name="ComboBox1" Width="120" SelectionChanged="ComboBox1_SelectionChanged" Margin="41,600,514,35">
<ComboBoxItem Content="Daytona" />
<ComboBoxItem Content="SecondTrack" />
<ComboBoxItem Content="None" />
</ComboBox>
</Grid>
</Window>
MainWindow.xaml.vb
Class MainWindow
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Select Case CType(ComboBox1.SelectedValue, ComboBoxItem).Content.ToString
Case "Daytona"
CType(TrackContainer.Child, UserControl1).runPathAnimation()
Case "SecondTrack"
CType(TrackContainer.Child, UserControl2).runPathAnimation()
End Select
End Sub
Private Sub ComboBox1_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)
Dim cmbox As ComboBox = CType(sender, ComboBox)
Select Case CType(cmbox.SelectedValue, ComboBoxItem).Content.ToString
Case "Daytona"
TrackContainer.Child = New UserControl1()
Case "SecondTrack"
TrackContainer.Child = New UserControl2()
Case "None"
TrackContainer.Child = Nothing
End Select
End Sub
End Class

Related

Use the autoscoll of a listbox while respecting the mvvm

I found the sample code of "Nick Miller" on the following question:
mvvm how to make a list view auto scroll to a new Item in a list view
This partly answers my question because scrolling works very close, but I need the user can stop automatic scrolling.
To do this I added a checkbox, and in the eveinement puts it true or false the variable listbox.autoscroll, but this has no effect despite the fact that the code will change the property.
I have not changed the Nick Miller code on the LoggingListBox class.
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Test_Listbox_Autoscroll"
xmlns:tools="clr-namespace:Test_Listbox_Autoscroll"
mc:Ignorable="d"
Title="MainWindow" Width="800"
SizeToContent =" WidthAndHeight">
<Grid>
<StackPanel >
<tools:LoggingListBox x:Name="Listbox1"
Margin=" 10"
Background="Bisque"
Height="180"
ItemsSource="{Binding LST_ListBox1_Collection}"
SelectedItem="{Binding LST_ListBox1_SelectedItem}"/>
<CheckBox x:Name="ChkAutoScroll"
Margin="10"
Content="Auto Scroll"
Click="ChkAutoScroll_Click"/>
</StackPanel>
</Grid>
</Window>
Private Sub ChkAutoScroll_Click(sender As Object, e As RoutedEventArgs)
If (ChkAutoScroll.IsChecked = True) Then
Listbox1.AutoScroll = True
Else
Listbox1.AutoScroll = False
End If
End Sub
There is no error message, but scrolling is still active despite the AutoScroll value change.

Databinding of ObservableCollection to TextBoxes in Tab

I started writing an application and I am facing trouble with the databinding of an observablecollection, because I am not very familiar with WPF an Binding. Further the different method of binding like object binding, xaml binding are confusing me.
The idea is to retrieve data from a SQL statement and add them to a observablecollection. Afterwards textboxes/comboboxes which are located in a tab in the mainwindows should be updated with this data.
I have a SQL Class which is retrieving the data from a sqlserver and populating the observablecollection. The following code is working at the moment:
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Data
Imports System.Collections.ObjectModel
Imports System.Xml
Imports System.Xml.Linq
Public Class SQLQueries
Public Sub GetPersonData(ByVal HRID_TextBox_OnB As String)
Dim con As New SqlConnection(My.Settings.AppConnString.ToString) 'connectionstring is retrieved from app settings
Dim cmd As New SqlCommand(QPersonDataQuery & "and person.personnelnumber = #DBG_HRID", con)
cmd.Parameters.AddWithValue("#DBG_HRID", HRID_TextBox_OnB)
Dim PersonData As New ObservableCollection(Of String) PersonData.Clear()
Try
con.Open()
Dim reader As SqlDataReader = cmd.ExecuteReader()
If (reader.HasRows) Then
While (reader.Read())
For i = 0 To reader.FieldCount - 1
PersonData.Add(i)
Next i
End While
End If
Catch ex As Exception
MessageBox.Show("Better call Saul!!" & vbCrLf & vbCrLf + ex.Message)
Finally
If con.State <> ConnectionState.Closed Then con.Close()
End Try
con.Dispose()
End Sub
End Class
My XAML is looking like this at the moment:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="FAT Client Primary Access" Height="609" Width="811" Background="White">
<Grid>
<Menu IsMainMenu="True" Height="28" VerticalAlignment="Top" Background="White">
<MenuItem Header="_File">
<MenuItem Header="_Close" Click="CloseApp_Click"/>
</MenuItem>
<MenuItem Header="_Database">
<MenuItem Header="_Check Connection" Click="CheckConnection_Click"/>
<MenuItem Header="_Change Connection String" Click="ChangeConnection_Click"/>
</MenuItem>
</Menu>
<TabControl Height="544" HorizontalAlignment="Left" Margin="0,26,0,0" Name="TabControl1" VerticalAlignment="Top" Width="789" Background="White">
<TabItem Header="Onboarding" Name="TabItem1" Background="White">
<Grid Background="White" Width="797" Height="524">
<Label Content="HRID" Height="27" HorizontalAlignment="Left" Margin="32,24,0,0" Name="Label1" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="74,24,0,0" Name="TextBox1" VerticalAlignment="Top" Width="83" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="182,23,0,0" Name="Button1" VerticalAlignment="Top" Width="75" />
<TextBox Height="26" HorizontalAlignment="Left" Margin="158,104,0,0" Name="TextBox2" VerticalAlignment="Top" Width="124" />
</Grid>
</TabItem>
<TabItem Header="other Trigger" Name="TabItem2" Background="White">
<Grid Background="White" />
</TabItem>
</TabControl>
</Grid>
</Window>
Unfortunately I have no idea how to bind the first value in my observablecollection to textbox2. I tried and read a lot but this was more confusing then helping out.
Do I need a separate Class to bind the observablecollection to the textboxes?
I would appreciate it if could give a me small hint.
Thanks in advance. And also Hello everybody.
<TextBox x:Name="textBox2" Text="{Binding [2].Name}" />
This binding path will show Name property of 3rd element of your ObservableCollection.
<TextBox x:Name="textBox2" Text="{Binding [0].Name}" />
So, this will show Name of first element of your collection.
But how Textbox will know what is the collection to use ? For that you have to set DataContext either at root level, or at your TextBox level. This root can be anywhere above your TextBox. DataContext set at this root will be visible within all children of this root only.
Your data can be complex like Country>States>City.For example, you can set DataContext to Country at root level, and some child elements can then use States, while some can use City etc.
So, set DataContext like this :
Imports System.Collections.ObjectModel
Class MainWindow
Public Property InvoiceCollection As New ObservableCollection(Of Invoice)
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Fill your InvoiceCollection.
...
...
Me.DataContext = InvoiceCollection
End Sub
End Class
Then you can show TotalPrice of first Invoice item like :
<TextBox x:Name="textBox2" Text="{Binding [0].TotalPrice}" />
You can even set DataContext of TextBox2 like :
TextBox2.DataContext = InvoiceCollection[0]
then databinding will look like :
<TextBox x:Name="textBox2" Text="{Binding TotalPrice}" />
You can even set DataContext of TextBox2 like :
TextBox2.DataContext = InvoiceCollection
then databinding will look like :
<TextBox x:Name="textBox2" Text="{Binding [0].TotalPrice}" />
Few important links :
DataBinding in 7 part series
Property path syntax

How to use trigger event in a button inside a datagrid in silverlight using relaycommand mvvm

How to use trigger event in a button inside a datagrid in silverlight using relaycommand mvvm
Iam unable to get selected values in to some Dto , it means once i selected a row for delete , the selected item property showing NULL .how to solve it pls
You can use trigger event like below in datagrid:
<Button Content="Message" Height="23" HorizontalAlignment="Left" Margin="234,116,0,0" Name="btnMsg" VerticalAlignment="Top" Width="75" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<si:CallDataMethod Method="HandleShowMessage"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
You have to add necessary reference for this.
For selecteditem you have to set selected item into datagrid and other thing you have to decalre a property in viewmodel:
In Xaml:
<sdk:DataGrid Height="Auto" AutoGenerateColumns="False" ItemsSource="{Binding Emp}" SelectedItem="{Binding SelectedEMp,Mode=TwoWay}" BorderThickness="1" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="auto">
and in Viewmodel:
private EmpInfo _selectedEMp;
public EmpInfo SelectedEMp
{
get { return _selectedEMp; }
set
{
_selectedEMp = value;
on("SelectedEMp");
}
}
Thanks

Xaml Data Binding

I have the below xaml that I am trying to bind to my class. I am having trouble getting the values to show up. Can anyone point me in the direction of what I am missing. Thank you in advance.
Dim frm As New EditPart
frm.DataContext = New SelectedPart(_CPPartPicker.Selected_Part, "ABC")
frm.Show()
Class SelectedPart
Property Part_Key As Integer
Property Part_Id As String
Property Part_Rev As String
Property Whse As String
Property Part_Description As String
Sub New(Part As SNC.SL.Common.CP_Item.CP_Item_Lookup_Version_1Item_Lookup_Response, Whse As String)
Part_Key = Part.ITEM_KEY
Part_Id = Part.ITEM_ID
Part_Rev = Part.ITEM_RVSN_ID
Whse = Whse
Part_Description = Part.ITEM_DESC
End Sub
End Class
<Grid x:Name="LayoutRoot" Margin="2">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<sdk:Label Content="{Binding Path=Part_Id, StringFormat='Part ID: \{0}'}" />
<sdk:Label Content="{Binding Path=Part_Rev, StringFormat='Part Rev: \{0}'}" />
<sdk:Label Content="{Binding Path=Part_Description, StringFormat='Description: \{0}'}"/>
<Button x:Name="CancelButton" Content="Cancel" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
<Button x:Name="OKButton" Content="OK" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />
</Grid>
In the ouput window I get the below error message:
Cannot get 'Part_Id' value (type 'System.String') from 'SNC.CommonStock.SelectedPart' (type 'SNC.CommonStock.SelectedPart'). BindingExpression: Path='Part_Id' DataItem='SNC.CommonStock.SelectedPart' (HashCode=53866394); target element is 'System.Windows.Controls.Label' (Name=''); target property is 'Content' (type 'System.Object').. System.MethodAccessException: Attempt by method 'System.Windows.CLRPropertyListener.get_Value()' to access method 'SNC.CommonStock.SelectedPart.get_Part_Id()' failed.
The labels are all on top of one another at present, if there is no description then potentially you'll see no content. Place the labels in a StackPanel.
I had to make the class I was binding to public

Comboboxes in GridView are synchronized instead of bound to the value from the database

I have tried to set up combo boxes in the gridview but all the combo boxes have the same value in them instead of the value from the database. I am using entity framework and WPF. There is a parent child relationship between two tables but the source for the combo box is a separate table with names and IDs for tags. I have been looking all day. Hopefully this won't be too easy to solve.
The "Tag" Column displays the combo box. The Column "Tag ID" displays the value from the database. When I display the data the TagID Changes in diffrent rows but the Tag column is the same (the first choice) in all the rows. When I change one combo box they all change. I can't see where they are hooked together. Any assistance you can provide would be appreciated. (Buler?)
Here is the XAML
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="372" Width="675" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:TagFinanceWPF">
<Window.Resources>
<CollectionViewSource x:Key="TransactionsViewSource" d:DesignSource="{d:DesignInstance my:Transaction, CreateList=True}" />
<CollectionViewSource x:Key="TransactionsTransactionTagsViewSource" Source="{Binding Path=TransactionTags, Source={StaticResource TransactionsViewSource}}" />
<CollectionViewSource x:Key="TagLookup" />
</Window.Resources>
<Grid DataContext="{StaticResource TransactionsViewSource}">
<ListView ItemsSource="{Binding Source={StaticResource TransactionsTransactionTagsViewSource}}" Margin="12" Name="TransactionTagsListView" SelectionMode="Single">
<ListView.ItemContainerStyle>
<Style>
<Setter Property="Control.HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Control.VerticalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn x:Name="TransactionIDColumn1" Header="Transaction ID" Width="80">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=TransactionID}" Margin="6,-1,-6,-1" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="TagIDColumn" Header="Tag" Width="80">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox Margin="-6,-1"
ItemsSource="{Binding Source={StaticResource TagLookup}}"
DisplayMemberPath="TagName"
SelectedValuePath="TagID"
SelectedValue="{Binding TagID}"
IsReadOnly="True">
</ComboBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="TagIDColumn2" Header="Tag ID" Width="80">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=TagID}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
The VB code is:
Class MainWindow
Dim BentleyvideoEntities As TagFinanceWPF.bentleyvideoEntities = New TagFinanceWPF.bentleyvideoEntities()
Private Function GetTransactionsQuery(ByVal BentleyvideoEntities As TagFinanceWPF.bentleyvideoEntities) As System.Data.Objects.ObjectQuery(Of TagFinanceWPF.Transaction)
Dim TransactionsQuery As System.Data.Objects.ObjectQuery(Of TagFinanceWPF.Transaction) = BentleyvideoEntities.Transactions
'Update the query to include TransactionTags data in Transactions. You can modify this code as needed.
TransactionsQuery = TransactionsQuery.Include("TransactionTags")
'Returns an ObjectQuery.
Return TransactionsQuery
End Function
Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
'Load data into Transactions. You can modify this code as needed.
Dim TransactionsViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("TransactionsViewSource"), System.Windows.Data.CollectionViewSource)
Dim TransactionsQuery As System.Data.Objects.ObjectQuery(Of TagFinanceWPF.Transaction) = Me.GetTransactionsQuery(BentleyvideoEntities)
TransactionsViewSource.Source = TransactionsQuery.Execute(System.Data.Objects.MergeOption.AppendOnly)
'Load data into Tags. You can modify this code as needed.
Dim customerList = From c In BentleyvideoEntities.Tags _
Order By c.TagName
Dim custSource = CType(Me.FindResource("TagLookup"), CollectionViewSource)
custSource.Source = customerList.ToList()
End Sub
End Class
I found this while researching your issue and it sounds like the exact same issue you are experiencing.
Snippit from link:
I'm not sure if this will help, but I
was reading in Chris Sells 'Windows
Forms Binding in C#, footnote, page
482', that the data source is bound to
each combobox and is managed by a
common Binding manager which in turn
is part of a Binding Context. The
Binding amager keeps all comboboxes
synchronized to the same row in the
database. However, if each combobox
has a different Binding context, hence
a diferent Binding Manager, then the
combo boxes can show different rows
from the same data source.
Based on this second article (and the suggested solution) you would need to use the row databinding event to set up the combobox's binding so that a new instace of the binding manager is created for each row bind.