Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Eigenes Control / DependencyProperty Binding
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

Eigenes Control / DependencyProperty Binding

beantworten | zitieren | melden

Hallo Leute,

ich möchte eine eigenes Control erstellen an dem ganz Normal gebindet werden kann.
Leider will mir das nicht gelingen. Hier erstmal der Code:
ItemSelectionControl.xaml
<StackPanel>
            <ItemsControl ItemsSource="{Binding SelectedItems}">

            </ItemsControl>
            <Expander Header="Status">
                <ItemsControl ItemsSource="{Binding Items}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Button Margin="20,10" Content="{Binding Name}" Tag="{Binding ID}" Click="Button_Click"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Expander>
        </StackPanel>

ItemSelectionControl.xaml.cs

public partial class ItemSelectionControl : UserControl
	{
		public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<IDName>), typeof(ItemSelectionControl));
		public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItems", typeof(ObservableCollection<IDName>), typeof(ItemSelectionControl));

		public ObservableCollection<IDName> Items
		{
			get { return (ObservableCollection<IDName>) GetValue(ItemsProperty); }
			set { SetValue(ItemsProperty, value); }
		}
		public ObservableCollection<IDName> SelectedItems
		{
			get { return (ObservableCollection<IDName>) GetValue(SelectedItemsProperty); }
			set { SetValue(SelectedItemsProperty, value); }
		}

		public ItemSelectionControl()
		{
			InitializeComponent();
			DataContext = this;
		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			Button button = (Button) sender;

			foreach (IDName state in Items) {
				if ((Guid) button.Tag == state.ID) {
					SelectedItems.Add(state);
					Items.Remove(state);
					break;
				}
			}
		}
	}

Und im MainWindow jeweils das:
<local:ItemSelectionControl Items="{Binding States}" SelectedItems="{Binding SelectedStates}" />

public ObservableCollection<IDName> States { get; set; }
		public ObservableCollection<IDName> SelectedStates { get; set; }

		public MainWindow()
		{
			InitializeComponent();
			DataContext = this;
		}

Im Output Fenster steht folgendes dazu:
Fehler
System.Windows.Data Error: 40 : BindingExpression path error: 'States' property not found on 'object' ''ItemSelectionControl' (Name='')'. BindingExpression:Path=States; DataItem='ItemSelectionControl' (Name=''); target element is 'ItemSelectionControl' (Name=''); target property is 'Items' (type 'ObservableCollection`1')

System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedStates' property not found on 'object' ''ItemSelectionControl' (Name='')'. BindingExpression:Path=SelectedStates; DataItem='ItemSelectionControl' (Name=''); target element is 'ItemSelectionControl' (Name=''); target property is 'SelectedItems' (type 'ObservableCollection`1')

Er findest also die State Propertys im ItemSelectionControl nicht ... Aber ich versteh garnicht wieso er nach denen dort sucht o.O
Ich mein ich binde die doch im MainWindow an meinem Control
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Coooder am .
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Coooder,

das Problem hat ja erstmal nichts mit eigenen UserControls zu tun. Wenn du ein Property an deine States- oder SelectedStates-Collection binden willst, mußt du der View auch erstmal die dazugehörige Objektinstanz (dein ViewModel?) verfügbar machen, indem du sie an den DataContext zuweist.

Am besten machst du es auch gleich richtig und setzt MVVM ein.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

beantworten | zitieren | melden

Na das tu ich doch im Konstruktor

DataContext = this;
Und this ist ja mein Control, also die objektinstanz meiner Collections.
Oder hab ich das falsch verstanden?

Ich benutzt im moment grad kein extra ViewModel weil ich erstmal nur das mit den DependencyProperties testen wollte. Sobald das klappt setzt ich alles richtig um fürs MVVM
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von Coooder
Und this ist ja mein Control

Warum wunderst du dich dann darüber, daß das State-Property in der ItemSelectionControl gesucht wird?

Und überhaupt: Wieso solltest du zwei Eigenschaften der gleichen Klasse aneinander binden? Dann kannst du doch gleich das Items-Property verwenden anstatt des State-Propertys.

Für mich sieht das alles trotzdem so aus, als hast du die Eigenschaften im MainWindow definiert.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

beantworten | zitieren | melden

Zitat von MrSparkle
Warum wunderst du dich dann darüber, daß das State-Property in der ItemSelectionControl gesucht wird?
Weil es im ItemsSelectionControl nur meine Items Propertys gibt

Zitat von MrSparkle
Und überhaupt: Wieso solltest du zwei Eigenschaften der gleichen Klasse aneinander binden? Dann kannst du doch gleich das Items-Property verwenden anstatt des State-Propertys.
Sry das versteh ich nicht.
Zitat von MrSparkle
Für mich sieht das alles trotzdem so aus, als hast du die Eigenschaften im MainWindow definiert.

das MainWindow stellt in den Collections die letzendlichen Daten bereit. Die Werden dann an mein Control gebunden. Der Teil ist ja an sich nicht anders als wenn ich die Collections an eine ListBox oder so binden würde.
Ich Binde also meine StateCollection an die Items Property meines Controls.
Innerhalb meines Controls Bindet dann ein ItemsControl die Collection Items
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von Coooder
Der Teil ist ja an sich nicht anders als wenn ich die Collections an eine ListBox oder so binden würde.

Hast du mal probiert, die States-Auflistung an ein normales ItemsControl zu binden? Dann würde sich ja herausstellen, ob es ein Problem deiner MainWindow-View ist oder deines UserControls.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers