Laden...

Eigenes Control / DependencyProperty Binding

Erstellt von Coooder vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.537 Views
C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 8 Jahren
Eigenes Control / DependencyProperty Binding

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:> Fehlermeldung:

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

5.657 Beiträge seit 2006
vor 8 Jahren

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

C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 8 Jahren

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

5.657 Beiträge seit 2006
vor 8 Jahren

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

C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 8 Jahren

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

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.

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

5.657 Beiträge seit 2006
vor 8 Jahren

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