myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » WPF Combobox: Binding auf Selected Item???
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

WPF Combobox: Binding auf Selected Item???

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
tonka
myCSharp.de-Mitglied

avatar-2860.gif


Dabei seit: 05.12.2006
Beiträge: 373
Entwicklungsumgebung: VS 2005/2008/2010
Herkunft: Österrreich


tonka ist offline

WPF Combobox: Binding auf Selected Item???

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich versuche gerade verzweifelt das SelectedItem ein WPF ComboBox an eine lokales Object zu binden. Ich habe mit google zwar einige Beispiele gefunden, jedoch funktioniert keines! Hier ist eine kurzer Ausschnitt aus meinem Source-Code den ich bis jetzt habe:

C#-Code:
...
public class TestClass
{
    public Object SelObject = null;
    public ObservableCollection<String> ElementList = null;

    public TestClass()
    {
         ElementList = new ObservableCollection<String>(){"a","b","c"};
         Combo.ItemSource = ElementList ;
    }
....
}

Das mit dem ItemSource funktioniert!

Mein XAML Code Sie folgendermaßen aus:

C#-Code:
<ComboBox SelectedValue="{Binding Path=SelObject }" Name="Combo" HorizontalAlignment="Left" Width="150" IsSynchronizedWithCurrentItem="True" />

Ich weiß nicht was ich immer falsch mache, bei allen anderen Dingen wie z.B. bei einer TextBox funktioniert das Prima.

Weiß jemand von euch wie ich das richtig schreiben müsst, um das SlectedItem an ein lokales Object zu binden???

MfG
Tonka
03.02.2009 16:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
michlG michlG ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2909.png


Dabei seit: 26.07.2007
Beiträge: 3.430
Entwicklungsumgebung: VS 2010 PRO
Herkunft: Naturns - Südtirol - Italien


michlG ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo tonka,

versuche mal im Binding anstatt dem SelectedValue das SelectedItem-Property zu verwenden.
Also so:

XML-Code:
<ComboBox SelectedItem="{Binding Path=SelObject }" Name="Combo" HorizontalAlignment="Left" Width="150" IsSynchronizedWithCurrentItem="True" />

Denn im SelObject - Object wird ja nicht der Wert des Objects sondern das Object selbst stehen (oder hast du das da anders gelöst?).

Gruss
Michael
03.02.2009 18:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tonka
myCSharp.de-Mitglied

avatar-2860.gif


Dabei seit: 05.12.2006
Beiträge: 373
Entwicklungsumgebung: VS 2005/2008/2010
Herkunft: Österrreich

Themenstarter Thema begonnen von tonka

tonka ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hy michlG,

hat leider auch nicht funktioniert. Hast noch eine andere Idee? Im Anhang findest du das kleine Test-VS-Solution!

Und hier ist der Code:

XAML:

C#-Code:
<Window x:Class="ComboboxBindingTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ComboBox SelectedItem="{Binding Path=SelObject}" Margin="80,0,78,129" Name="Combo" IsSynchronizedWithCurrentItem="True" Height="23" VerticalAlignment="Bottom" />
        <Button Height="23" Margin="96,32,106,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button>
    </Grid>
</Window>

Und die *.cs dazu

C#-Code:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ComboboxBindingTest
{
    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Object SelObject = null;
        public ObservableCollection<String> ElementList = null;

        public Window1()
        {
            InitializeComponent();

            ElementList = new ObservableCollection<String>() { "a", "b", "c" };
            Combo.ItemsSource = ElementList;
            Combo.DataContext = this;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (SelObject == null)
            {
                MessageBox.Show("null");
            }
            else
            {
                MessageBox.Show(SelObject.ToString());
            }
        }
    }
}

MfG
Tonka


Dateianhang:
unknown ComboboxBindingTest.zip (43 KB, 369 mal heruntergeladen)
03.02.2009 19:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
michlG michlG ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2909.png


Dabei seit: 26.07.2007
Beiträge: 3.430
Entwicklungsumgebung: VS 2010 PRO
Herkunft: Naturns - Südtirol - Italien


michlG ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo tonka,

sorry aber ich habe vorhin gemeint dass du das Gegenteil machen willst (also das SelectedItem mit dem SelObject setzen und nicht das Gegenteil.

Habe gerade versucht das zu lösen, ich bin aber auch gescheitert Heute habe ich aber leider nicht mehr die Zeit mir das genauer anzusehen.

Gruss
Michael
03.02.2009 20:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ich wuesste nicht wie das geht - aber warum machst du es nicht so?

C#-Code:
public Object SelObject
{
    get { return Combo.SelectedItem; }
}
06.02.2009 13:09 Beiträge des Benutzers | zu Buddylist hinzufügen
tonka
myCSharp.de-Mitglied

avatar-2860.gif


Dabei seit: 05.12.2006
Beiträge: 373
Entwicklungsumgebung: VS 2005/2008/2010
Herkunft: Österrreich

Themenstarter Thema begonnen von tonka

tonka ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

hey,

ich wollte alles mit binding machen, weil sich hierbei so schön die GUI von der Geschäftslogik trennen lässt. Aber so wie's aussieht werd ich es wohl so machen müssen!

MfG
Tonka
06.02.2009 20:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

die trennung xaml-cs ist eh nicht elegant - die xaml und cs gehoeren zusammen - wenn du trennen moechtest sollte die cs auch nur gui sachen und verbindungen erledigen, und ueber schnittstellen zu anderen objekten laufen (zb nen controller oder so)
dann kannst du ganz einfach ein event holen wenn die selektion geaendert wurde - und das entsprechende objekt in deinen anderen objekten weiter reichen

zb
MainView.xaml+MainVIew.cs <=> Controller.cs <=> Model
OnSelectItem => Controller.SelectedObject [=> Model]

am besten machst du das auch ueber events und feddich

die view kannst du auch noch einzeilen und so ueber commands entsprechend reagieren
so hat sich das MVP bei mir schon bewaert

View1 <=>
View2 <=> Dispatcher (MainWindow) <=> Controller.cs <=> Model
View3 <=>

Der dispatcher gibt auftraege an dem controller - der macht das voodo und speichert daten in model und sagt dem dispatcher was an zu zeigen ist - dieser verteilt die anzeigen dan an dem entsprechenden view

schon hast du die beste trennung - kannst jederzeit die views austauschen {o;
die kommunikatin der views zum dispatcher dann ueber commands, dann braucht der dispatcher nichtmla wissen welche view was an gestossen hat
07.02.2009 12:04 Beiträge des Benutzers | zu Buddylist hinzufügen
winSharp93 winSharp93 ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2918.png


Dabei seit: 19.01.2007
Beiträge: 5.742
Herkunft: Stuttgart


winSharp93 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Mr Evil:
die trennung xaml-cs ist eh nicht elegant - die xaml und cs gehoeren zusammen - wenn du trennen moechtest sollte die cs auch nur gui sachen und verbindungen erledigen, und ueber schnittstellen zu anderen objekten laufen (zb nen controller oder so)

Doch, normalerweise sollte unter WPF die *.cs Datei leer bleiben.

Zitat von Mr Evil:
MainView.xaml+MainVIew.cs <=> Controller.cs <=> Model
OnSelectItem => Controller.SelectedObject [=> Model]

Unter WPF sollte man nur noch MVVM verwenden; weder MVC, noch sonstige "veraltete" Pattern.
07.02.2009 12:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tonka
myCSharp.de-Mitglied

avatar-2860.gif


Dabei seit: 05.12.2006
Beiträge: 373
Entwicklungsumgebung: VS 2005/2008/2010
Herkunft: Österrreich

Themenstarter Thema begonnen von tonka

tonka ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Mr Evil:

Da hast du mich falsch verstanden, i möchte nicht MainView.xaml und MainView.cs trennen, sondern die Übergabe der Instanz (der GUI) an die GUI-Element (wie z.B. textbox, Combobox, etc.) selbst auf ein Minimum beschränken!

Meine Vorgehensweiße sieht nach Möglichkeit immer folgendermaßen aus:

Zitat:
Controller <=> GUI

Bei mir gibts immer nur Controller, die GUI steuern, alles andere ist pfusch, den so bleibt die GUI austauschbar (bis auf kleinigkeiten *g*). Bin dieses Prinzip noch sehr aus C++ gewohnt!

Binding finde ich aus dem Grund sehr interessant und empfehlenswert, da es automatisch (laut meiner erfahrung) immer Multitasking fähig ist, ohne dafür eine einzige Zeile Code schreiben zu müssen!

Außerdem bin ich auch der Ansicht von winSharp93, das die cs der xaml am besten leer wäre, was ja nicht ganz funkt, da ja schließlich events, parameterübergaben etc. in der GUI deklariert werden müssn, damit der Controller auf die Ereignisse auch reagieren kann!
Es sollte in WPF wirklich das MVVM Pattern benutzt werden ,sofern es möglich ist!( http://www.codecomplete.de/blogs/xamlblo...-viewmodel.aspx)

MfG
Tonka

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tonka am 07.02.2009 18:46.

07.02.2009 18:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

das die cs datei meist nahezu leer ist bestreite ich ja nicht - wie gesagt gehoert die xaml und cs datei zusammen - dh ob es wie in der frage per property aus dem element geholt wird, oder es gebunden wird, spielt dann absolut keine rolle

zugegeben - das MVC war eigentlich nur mein ansatz
ich hatte es bei mir schon laenger zu

view <=> dispatcher <=> controller
umgebaut - was dem
view <=> modelview <=> model
gleicht in meinem code #gg

namen sind schall und rauch

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von userid14268 am 08.02.2009 13:04.

08.02.2009 12:42 Beiträge des Benutzers | zu Buddylist hinzufügen
t-master t-master ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.03.2007
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2005


t-master ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

also ich beteilige mich hier mal nicht an der pattern diskussion, sondern liefere einfach mal das, was der TE meiner Meinung nach gesucht hat:
Dieser Code

XML-Code:
<ComboBox SelectedItem="{Binding Path=SelObject }" Name="Combo" HorizontalAlignment="Left" Width="150" IsSynchronizedWithCurrentItem="True" />

bewirkt, dass das SelectedItem der ComboBox mit dem SelObject ersetzt wird.
Wenn du also SelObject änderst, ändert sich auch das ausgewählte Item der ComboBox.
Du solltest dir das mal anschauen  Link
Wenn du also noch ein "Mode=OneWayToSource" einfügst

XML-Code:
<ComboBox SelectedItem="{Binding Path=SelObject, Mode=OneWayToSource}" Name="Combo" HorizontalAlignment="Left" Width="150" IsSynchronizedWithCurrentItem="True" />

dann ändert sich das SelObject, wenn du die Auswahl der ComboBox veränderst.
Hintergrund:
mit "Property={Binding Path=AnotherProperty}" bindest du Property an AnotherProperty, Property ist also das Ziel, das sich ändert, sobald sich die Quelle, AnotherProperty, ändert. Der OneWayToSource-Mode ist dann die Umkehrung, sodass AnotherProperty das Ziel ist und sich ändert, wenn Property geändert wird.
Und mit dem TwoWay-Mode hältst du beide Propertys synchron, dh sobald du eine davon änderst, wird die andere mitgeändert.

Hoffe ich konnte dir ein bisschen helfen großes Grinsen
10.02.2009 19:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Jahre.
Der letzte Beitrag ist älter als 11 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 24.11.2020 18:44