Laden...

SelectedItem

Erstellt von stefan123 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.233 Views
S
stefan123 Themenstarter:in
107 Beiträge seit 2009
vor 13 Jahren
SelectedItem

Hallo Leute

In meiner View-Klasse Habe Ich ein Property SelPerson, also die aktuell Selektierte Person-Klasse diese Klasse beinhaltet auch die eine 1 zu 1 beziehung zur Klasse Länder. Nun habe ich weiter noch eine Combobox Länder und möchte gerne die Combobox Länder an die Klasse der Person.idfs_land binden.

Doch Leider wird das Land zur Person nicht angezeigt.

Weiss Jemand wieso

Danke

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo stefan123,

es ist so sehr schwierig zu sagen was du falsch machst wenn du uns nicht sagst was du machst 😉

Kurz gesagt würde ich das so machen


<ComboBox ItemsSource="{Binding MyCountries, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding Path=SelPerson.idfs_land, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

Aber ohne weitere Details können wir die keine schöne Lösung sagen die 100%tig funktioniert!

Gruss
Michael

S
stefan123 Themenstarter:in
107 Beiträge seit 2009
vor 13 Jahren

Hallo

Ich abe das ganze mal so gebunden
die ItemsSource="{Binding Source={StaticResource CmbListen}
also die cmblisten beinhalten alle Länder die anfangs mit gebunden werden.
Danach möchte ich die Werte aus der SelPersonen Collection mit der Länder Combobox synchronisieren.



 <ComboBox Height="23" HorizontalAlignment="Left" Margin="1,133,0,0" Name="comboBox4" VerticalAlignment="Top" Width="160" Grid.Column="2" Grid.Row="1" ItemsSource="{Binding Source={StaticResource CmbListen}, Path=LandCollection}" IsSynchronizedWithCurrentItem="{Binding Path=SelPerson.tbl_land.id_land, Source={StaticResource PersonViewModel}}" SelectedItem="{Binding Path=SelPerson.tbl_land.id_land, Mode=TwoWay, Source={StaticResource PersonViewModel}}">
                                <ItemsControl.ItemTemplate >
                                    <DataTemplate >
                                        <StackPanel>
                                            <TextBlock Text="{Binding Path=land}"></TextBlock>
                                        </StackPanel>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ComboBox>


3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

IsSynchronizedWithCurrentItem brauchst du nicht zu binden.
Das gibt nur an ob das CurrentItem (SelectedItem) von dem Control mit dem CurrentItem in der Liste synchronisert werden soll.
Setze es einfach auf true, das Binding ist nutzlos.

Sind die Elemente in dieser LandCollection vom selben Typ wie deine Id_land von der selektieren Person?
Ist das id_land nur ein Index (ID) vom Land?
Weil dann wäre klar dass es so nicht funktioniert, wenn du komplette Landobjekte wählst und dass sagst setze mir 2 als SelectedItem.

Gruss
Michael

S
stefan123 Themenstarter:in
107 Beiträge seit 2009
vor 13 Jahren

Das sind die gleichen Typen

LanColl enthält mehrer Land-Klassen.
SelPerson enthält eine Land-Klasse.

Hallo wenn ich IsSynchronizedWithCurrentItem auf true setze dann kommt die Fehlermeldung die Eigenschaft ist ungültig

Arbeite mit VS2010

S
stefan123 Themenstarter:in
107 Beiträge seit 2009
vor 13 Jahren

Hallo michlG

Wenn ich dich richtig verstanden habe!

Dann kann ich das Objeckt Land in der SelPerson CMB nicht mit der CMB Länder synchronisieren?
Da es sich in der SelPerson CMB um ein Objeckt Land handel und in der Länder CMB um Indexe!

Wär es denn möglich wenn ich das ganze Objekt nehme und synchronisiere?
Also SelPerson.Land== LänderColl.

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

da es sehr schwierig ist sowas in Worte / Text zu fassen hab ich schnell ein Beispiel gecoded.

Siehe:


using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication5
{
	/// <summary>
	/// Interaction logic for MainWindow.xaml
	/// </summary>
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();

			Countries = new ObservableCollection<Country>
			            	{
			            		new Country {Id = 5, Name = "Germany"},
			            		new Country {Id = 4, Name = "Austria"},
			            		new Country {Id = 6, Name = "France"},
			            		new Country {Id = 2, Name = "Italy"}
			            	};

			Persons = new ObservableCollection<Person>
			          	{
			          		new Person {Name = "Mustermann", Country=Countries[2]},
			          		new Person {Name = "Mustermann1", Country=Countries[0]},
			          		new Person {Name = "Mustermann2", Country=Countries[0]},
			          		new Person {Name = "Mustermann3", Country=Countries[3]},
			          		new Person {Name = "Mustermann4", Country=Countries[1]}
			          	};

			DataContext = this;
		}

		public ObservableCollection<Person> Persons { get; set; }
		public ObservableCollection<Country> Countries { get; set; }
	}

	public class Person : INotifyPropertyChanged
	{
		private string _name;
		private Country _country;

		public string Name
		{
			get { return _name; }
			set { _name = value;
				NotifyPropertyChanged("Name");
			}
		}

		public Country Country
		{
			get { return _country; }
			set { _country = value;
			NotifyPropertyChanged("Country");}
		}

		#region INotifyPropertyChanged Members

		public event PropertyChangedEventHandler PropertyChanged;
		
		private void NotifyPropertyChanged(string name)
		{
			var handler = PropertyChanged;
			if (handler != null)
				handler(this, new PropertyChangedEventArgs(name));
		}

		#endregion
	}

	public class Country
	{
		public int Id { get; set; }
		public string Name { get; set; }
	}
}


<Window x:Class="WpfApplication5.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">
	<StackPanel Orientation="Vertical">
		<ListBox x:Name="ps" ItemsSource="{Binding Persons, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>
		<ComboBox ItemsSource="{Binding Countries}" DisplayMemberPath="Name" SelectedItem="{Binding ElementName=ps, Path=SelectedItem.Country, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
	</StackPanel>
</Window>

Das wäre ein Weg das Problem zu lösen, aber wie gesagt führen viele Wege an das Ziel 😃

Gruss
Michael