Modifiera ListBoxItem klassen för att lägga till ytterligare element Visual studio WPF C#

Permalänk

Modifiera ListBoxItem klassen för att lägga till ytterligare element Visual studio WPF C#

Finns det någotvis man kan adatera en existerande klass som ListBoxItem? Vad jag vill göra är att lägga till ett nytt värde, precis som hur item.Height, item.Width osv.. så att när jag väljer objekted så kan jag hämta detta nya element. Jag vill att det ska fungera precis som hur jag kan plocka fram en rektangles fill från det utvalda ListViewItem genom item.Content.

Jag vill att Content ska bestämma hur det ser ut i ListBox samtidigt som jag vill ha en klass kopplad till ListBoxItem.

private void BuildBlock_Selected(object sender, SelectionChangedEventArgs e)
{
ListBox lb = sender as ListBox;
ListBoxItem lbi = lb.SelectedItem as ListBoxItem;

(Klass klass 1 = (Klass1) lbi.Klass1;

Rectangle rectangle = (Rectangle) lbi.Content;
try
{
selectedColorBrush = (SolidColorBrush) rectangle.Fill;

}
catch (System.InvalidCastException ex) {
Debug.WriteLine(ex + "\nFailed to selected Solid Color Brush");
}

}

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Medlem

Det blev litet avhugget där, tror jag.

Visa signatur

Gammal och gnällig

Permalänk
Medlem

Jag gissar på att du har en egen datakälla som du vill visa i en listbox.

Om så är fallet så är det Listbox med databinding som du ska leta efter bra exempel på.

Permalänk
Skrivet av MickeBoy:

Jag gissar på att du har en egen datakälla som du vill visa i en listbox.

Om så är fallet så är det Listbox med databinding som du ska leta efter bra exempel på.

Jag har en klass BuildBlock som innehåller en ListBoxItem vars utessende är baserat på en rektangle. Jag kan nu hämta detta elementet från min egna klass lägga till det i en ListBox precis som jag vill men ListBoxItem har inte längre en koppling till klassen den skapades från. Jag vill kunna hämta PositionOnGrid värdet från listan.

private void LoadBuildBlocks()
{
foreach (var item in resourceDictionary.Values)
{
if (item.GetType() == typeof(Rectangle))
{
BuildBlock bb = new BuildBlock((Rectangle)item);
TestListBox.Items.Add(bb.ListBoxItem);
bbList.Add(bb);
}
Debug.WriteLine(item.GetType());
}
}

public string Name { get; set; }
public string PositionOnGrid { get; set; }
private Rectangle rectangle;

public BuildBlock() {
rectangle = new Rectangle();
rectangle.Height = 100;
rectangle.Width = 100;
rectangle.Fill = new SolidColorBrush(Colors.AliceBlue);
ListBoxItem item = new ListBoxItem();
item.Height = 100;
item.Width = 100;
item.Content = rectangle;
ListBoxItem = item;
}

public BuildBlock(Rectangle rect)
{
rectangle = new Rectangle();
Name = rect.Name;
rectangle.Height = rect.Height;
rectangle.Width = rect.Width;
rectangle.Fill = rect.Fill; ;
Debug.WriteLine("BuildBlock Tag: " + rect.Tag);
ListBoxItem item = new ListBoxItem();
item.Height = rect.Width;
item.Width = rect.Height;
item.Content = rectangle;
ListBoxItem = item;
}
public ListBoxItem ListBoxItem { get; set; }

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Medlem

Om du kollar in denna:

https://wpf-tutorial.com/list-controls/listbox-control/

så finns där en metod

private void btnShowSelectedItem_Click(object sender, RoutedEventArgs e) { foreach(object o in lbTodoList.SelectedItems) MessageBox.Show((o as TodoItem).Title); }

Eftersom du binder ListBoxItem i din lista så gissar jag att du skulle kunna skriva om den ungefär som:

private void btnShowSelectedItem_Click(object sender, RoutedEventArgs e) { foreach(object o in bbList.SelectedItems) MessageBox.Show((o as ListBoxItem).Content.Name); //Detta borde då visa namnet på den rektangel som tillhör det valda listboxitem }

Men jag har inte testat koden själv. Det känns som att exemplet ungefär motsvarar vad du vill göra.

Permalänk
Hedersmedlem

Du kan använda Tag för att spara godtyckliga objekt. Annars kanske kan låta BuildBlock vara en utökning av ListBoxItem?