Laden...

Forenbeiträge von xxxprod Ingesamt 1.378 Beiträge

07.09.2012 - 13:20 Uhr

Ich hab sowas selber noch nie probiert aber angeblich scheint das mit ClickOnce nicht möglich zu sein: How to include custom data files in ClickOnce deployment?

Aber eventuel hilft dir der Link hier weiter: How to: Include a Data File in a ClickOnce Application

Lg, XXX

07.09.2012 - 10:38 Uhr

Hallo Mary81,

könntest du bitte Code-Tags verwenden und den ganzen Programmcode hättest du auch nicht posten müssen.

ClickOnce kopiert soweit ich weiß immer nur die "relevanten" Files ins Zielverzeichnis. Ich glaube nicht, dass hier deine Dictionaries mitkopiert werden. Evt. musst du die unter Projekteigenschaften\Publish\Application Files noch einbinden oder manuell kopieren.

Lg, XXX

06.09.2012 - 14:28 Uhr

Meine Vermutung, das Bild mittels Dispose wieder freizugeben bevor du es erneut überschreiben kannst bestätigt sich in why does this code lock my files?.

Lg, XXX

06.09.2012 - 10:57 Uhr

Zum Lesen deiner Xml Daten: Ich hab zwar nirgends gelesen, dass man ein leeres DataTable verwenden muss, aber in allen (funktionierenden) Beispielen die ich gesehen habe, wird ein leeres verwndet. So auch hier in der MSDN: DataTable.ReadXml Method (XmlReader)

Eine Spalte aus deinem Datatable vergleichst du mit der Datenbank in dem du entweder die Spalte in die Datenbank kopierst und dort vergleichst oder die Spalte aus der DB in dein Programm holst und hier vergleichst.

Eventuel willst du ja auch mit DbDataAdapter arbeiten - der kann teilweise vollkommen selbstständig die Tabellen in der Datenbank anhand der Änderungen in einem Datatable aktualisieren.

Lg, XXX

05.09.2012 - 12:17 Uhr

Warum ReadXml nicht funktioniert kann ich dir nicht sagen und aber um etwas darüber sagen zu können müsstest du schon auch den Aufbau des Xmls und evt. der temp_DT posten.

zu deinem Id Vergleich: Du Vergleichst ob die DataColumn Namens ID der einen Tabelle ungleich der DataColumn Namens ID einer anderen Tabelle ist -> Natürlich; Sind doch zwei verschiedene Objekte.

Wenn du ungleiche Zeilen finden willst, musst du schon durch jede Zeile in haupt_DT.Rows die ID abrufen und sie in der temp_DT suchen. Entweder durchiterieren oder mit RowFilter.

Lg, XXX

31.08.2012 - 11:05 Uhr

Weil eine Wpf Anwendung eine Wpf- und keine Windows.Forms Anwendung ist. Ich habe bei meinem Projekt leider genau die selbe Konstellation und habe keinen Weg gefunden den Owner bei meinen Wpf-Windows zu setzen wenn das MainWindow ein WinForms Fenster ist.

Es gibt zwar allerhand Tricks und Tipps zu dem Thema aber wirklich funktioniert hat bei mir leider garnichts. Ich habs für mich so gelöst, das ich Modale Dialogfenster mit TopMost=true öffne, damit es nicht hinter das MainWindow fallen kann.

Wenn unerhofft doch jemand eine Lösung zu dem Problem postet würde mich das also auch sehr freuen. 😃

Lg, XXX

29.08.2012 - 12:07 Uhr

In form eines riesigen Fernsehers mit Touch in Besprechungszimmern wärs schon wieder praktisch - die ganzen Beamerlösungen, welche Handbewegungen an der Wand erkennen, funktionieren ja nur sehr bescheiden.

27.08.2012 - 11:21 Uhr

Vielleicht interessiert dich hierbei auch Zyan Communication Framework.

Lg, XXX

27.08.2012 - 09:57 Uhr

Ich verwende Commands mit der gleichen Implementierung aber ich verwende die CanExecute Methode bzw. das Event eigentlich nie - Ich verwende öfters eigene Properties, die dann über StyleTrigger evt. etwas disablen.

Ich finde die Implementierung mittels CommandManager.RequerySuggested auch eher unschön:
Es wird dann ja quasi für jeden Command der gerade in einer View steckt bei jeder Änderung die die View bemerkt ein CanExecuteChanged erzeugt oder? Zusätzlich bekommt der Command nichts davon mit, wenn sich dessen Zustand im Hintergrund geändert haben sollte.

Lg, XXX

27.08.2012 - 09:03 Uhr

Wo genau ist dein Problem? Was hast du probiert und was daran funktioniert nicht?

Wie dus angehen sollst willst du wissen? Schreib ein ItemTemplate welches abhängig von einem Zustand in deinem ViewModel das richtige Symbol darstellt.

Lg, XXX

24.08.2012 - 10:52 Uhr

Anderseits wünsche ich mir schon lange einen Schreibtisch, dessen gesamte Oberfläche ein Display ist.

Also das würde mir riesig gefallen. Wenn man die Sachen am Desktop dann auch "angreifen" könnte wärs noch cooler. Evt. ermöglicht das eine Technologie wie Leap Motion bald einmal.

22.08.2012 - 14:45 Uhr

Die Verwendung des Properties hättest du dir auch ergooglen können - in BasedOn wird natürlich ein anderer Style erwartet, welchen du zB mit StaticResource einbinden kannst.

Also


                 <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListViewItem}}" >
                    <EventSetter Event="MouseDoubleClick" Handler="OrtsteileListViewDoppelklick" />
                    <EventSetter Event="MouseLeftButtonUp" Handler="OrtsteileListViewKlick" />
                    <!--<Style.Triggers>
                        <Trigger Property="ListViewItem.IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Orange"></Setter>
                        </Trigger>
                    </Style.Triggers>-->
                </Style>

Lg, XXX

21.08.2012 - 16:28 Uhr

Das BasedOn muss in den "darunterliegenden" Styles angegeben werden. Die Appl.xaml ist ja die höchste Ebene - wenn ein neuer Style den alten übernehmen soll dann braucht man dazu das BasedOn.

Auch muss man beachten, dass ein Property durch einen Style nicht mehr gesetzt wird, wenn dieses bereits durch einen manuellen Wert gesetzt wurde.

Lg, XXX

16.08.2012 - 11:43 Uhr

Gibt es denn keine passenden Events die bei der bestimmten Aktion die gewünschte Aktion ausführt? Ich finde deine Variante ein Dummy UserControl zu verwenden in der Situation nicht so schlimm, was stört dich daran?

//Edit: Hier hab ich was dazu gefunden: Über Trigger sollte es so möglich sein: Function call within XAML code?

16.08.2012 - 11:04 Uhr

Ich behaupte mal garnicht aber eventuel gibts ja alternive Möglichkeiten. Was macht die aufgerufene Methode in etwa und zu welchem Zeitpunkt soll sie aufgerufen werden? Vor, während oder nach dem Laden des Controls?

Lg, XXX

14.08.2012 - 14:21 Uhr

Du vermischt einfach Äpfel und Birnen - Bei einer TextBox gibt es keine Items zu selektieren.

14.08.2012 - 14:13 Uhr

Aber ließ und versteh doch was ich sagen will: SelectedItem kann nicht automatisch irgendwelche Zurodnungen treffen, wenn die Quell- und Ziel- Typen unterschiedlich sind.

Einen Vorschlag hab ich bereits gemacht indem du die Enumwerte auf Strings änderst.

Alternativ kannst du das DataTable typisieren und änderst die Spalte Anrede auf den Typ "Anrede" oder du baust im SelectedItem Binding einen Converter ein, welcher von String auf dein Enum und Retour konvertiert.

Das WPF so gscheit ist und von SelectedItem(Enum)->DataRow(String) zu konvertieren kann man annehmen nachdem jedes Objekt eine Methode .ToString() besitzt aber wie soll .NET im Umkehrschluß wissen, dass dein String im DataTable ein Anrede Typ ist???

Also die zwei(drei) Möglichkeiten hast du.

Lg, XXX

14.08.2012 - 13:53 Uhr

//Edit: Schwachsinn gepostet...

trotzdem: GetValues gibt keine Strings zurück sondern wie der Name schon sagt die Werte - Verwende stattdessen GetNames im DataProvider.

14.08.2012 - 13:32 Uhr

Und die ItemsSource der ComboBox ist eine DeinEnum[], String[]?

SelectedItem funktioniert nur, wenn quell und zieltyp identisch sind - du ladest gerade strings aus der Datenbank und hast aber EnumWerte(welche keine Strings sind) in deiner ComboBox. Ändere mal deine ItemsSource auf string[] dann sollte es denke ich hinhauen.

Lg, XXX

14.08.2012 - 13:15 Uhr

Wie wird ein Eintrag im Datatable selektiert? Listbox?

Was ist die DataSource "Grundlage" deiner ComboBox und Textboxen? Eine DataRow? Ein DataTable?

Was für einen Datentyp hast du denn im DataTable für die Spalte Anrede? Int, String oder explizit deinen Enum-Typ?

Was genau passiert denn(nicht) in der ComboBox? Wie hast du getestet, dass der Wert der ComboBox in das DataTable geschrieben wird und wie verhält es sich denn beim Laden der Werte?

Und für XML Code gibt es bessere Formatierungsmöglichkeiten hier.

Lg, XXX

09.08.2012 - 17:26 Uhr

Das PlayerModel sollte nichts von einem Track wissen - dafür hast du ja das TrackVM eingeführt:

PlayerVM -> TrackVM -> Track

Lg, XXX

09.08.2012 - 16:03 Uhr

Sind das auf der Grafik zwei Gruppen die jeweils die dichte Menge an Datenpunkten zusammenfassen oder 4 Gruppen?

Und wie hast du manuell diese Gruppierungen gesetzt? Wie bist du dabei vorgegangen? Kannst du dieses Vorgehen nicht direkt als Algorithmus umsetzen? Wenn nicht, warum nicht?

09.08.2012 - 10:59 Uhr

Ich verstehe deine Frage nicht wirklich - Dein Aufbau ist grundsätzlich so ok würde ich behaupten.

Meinst du, wie du im PlayerVM zu einem TrackVM kommst bzw. wie das TrackVM in das PlayerVM kommen soll? Hast du schon probiert dein Konzept umzusetzen? Evt. geht dir dabei der Knoten auf.

Lg, XXX

06.08.2012 - 12:52 Uhr

Ok das lässt sich in deiner Konfiguration so erklären:

Das liegt am UpdateSourceTrigger welcher im Standardfall "LostFocus" ist. Da du nur ein Control in deiner Testapplikation hast ist es auch unmöglich dass dieses eine den Fokus verliert und daher wird set und get nie aufgerufen. Füge noch einen Button oder eine andere Tb ein dann wird der Setter und Getter auch beim Verlassen aufgerufen.

Alternativ kannst du wie Quaneu bereits in seinem Code erwähnt hat UpdateSourceTrigger auf PropertyChanged setzen.

Lg, XXX

06.08.2012 - 11:34 Uhr

Genau deswegen funktionierts ja auch nicht - Wenn du jedesmal einen anderen oder den "richtigen" Wert zurück geben würdest, würde sich die Anzeige auch dementsprechend anpassen.

06.08.2012 - 09:50 Uhr

//EDIT: Antwort revidiert... muss nochmal drüber nachdenken^^

//EDIT²: Also ich hätte hier eine Vermutung:

Properties werden oft nach dem Schema implementiert um rekursive Aufrufe durch Changed Events zu verhindern:


set
{
   if(_value != value)
   {
       _value=value;
       // handle changed events
   }
}

Ebenso merken sich die Properties der Controls ihre Werte und tun daher nur dann was, wenn sich wirklich etwas geändert hat und wenn das nicht der Fall ist, weil du immer den selben zurückgibst, wird natürlich der angezeigte Wert nicht verändert. Da kannst du noch so oft PropertyChanged feuern.

Lg, XXX

02.08.2012 - 16:02 Uhr

Alles was du dazu mMn. brauchst ist ein HierarchicalDataTemplate

lg. XXX

02.08.2012 - 09:09 Uhr

Hallo Quaneu,

ohne dein Problem mit gesharten Objekten in verschiedenen Auflistungscontrols jemals gehabt zu haben, verwende ich bei mir hin und wieder eine Lösung die dir hier ebenfalls helfen könnte:

Und zwar habe ich eine Wrapperklasse erstellt, welche das Objekt um die notwendigen "Gui-Spezifischen" Elemente erweitert.

z.B:


class MyListItem
{
   public object Item{get;set;}
   public bool IsSelected{get;set;}
}

In den Bindings musst du halt das .Item. noch zusätzlich anführen was aber mMn. kein Problem darstellen sollte.

Du müsstest halt dann in deinen ViewModels unterschiedliche Collections für die unterschiedlichen ListViews/TreeViews erstellen die jeweils eigene MyListItems haben die wiederum intern sich die gleichen Objekte sharen.

Lg, XXX

01.08.2012 - 10:39 Uhr

Ich würde nur die Informationen über die Termine speichern und dann mit geeigneten Abfragen die Daten live abrufen. Ich glaub nicht das die Vorberechnung von Terminen hier notwendig bzw. sinnvoll ist. Auch weil bei einem theoretisch unendlichem zyklischen Termin man unendlich viele Einträge generieren müsste sofern es kein maximales Datum in der DB gibt.

Lg, XXX

31.07.2012 - 10:50 Uhr

Ein Array ist aber ein Referenztyp und beim Übergeben des Arrays wird daher nur die Referenz auf dieses übergeben und nicht alle Werte extra kopiert.

Lg, XXX

//EDIT: Ansonsten kannst du auch deinen ValueType in einer Klasse kapseln und dieses Objekt dann überall verwenden.

//EDIT²: Letzteres wird dein Problem aber nicht beheben da eine Referenz auf einen Typen vermutlich mehr Speicher verbraucht als ein einfaches byte - Das Sinnvollste werden Arrays sein die du dann immer als "ganzes" übergibst.

24.07.2012 - 17:05 Uhr

Wie du bereits festgestellt hast geht das so über den Index nicht. Ich würde stattdessen lieber eine ID oder sowas aus deiner Datenzeile rausholen und die nachher beim Neubefüllen aus allen Zeilen raussuchen und zu selektieren.

Was du als Identifier in deinen Daten verwenden kannst musst du selbst definieren.

Lg, XXX

24.07.2012 - 16:43 Uhr

Warum fragst du den Index des Items nicht **vor **dem Clear ab?

Lg, XXX

23.07.2012 - 15:21 Uhr

Du kannst mit () groupieren und mit ?<> kannst du einer Gruppe sogar einen Namen zuweisen also kannst du mit

ID="(.*?)"

eine Gruppe erstellen die du dann unter Match.Groups abfragen kannst.

Lg, XXX

23.07.2012 - 14:03 Uhr

Du nimmst einen (Toogle)Button und aktivierst/deaktivierst (bzw. visible=true/false setzen) eine Textbox per Trigger. Um dann visuell auch noch dorthin zu kommen kannst du Templates überschreiben, Animationen einbauen usw. usf.

Lg, XXX

23.07.2012 - 10:56 Uhr

Entweder du hast 3x 1:1 Beziehungen, dann brauchst du auf beiden Seiten jeweils 3 Properties um entsprechend navigieren zu können. Oder du realisierst es als 1:n Beziehung und hast dann auf beiden Seiten nur eine Property. Auf der "1" Seite eine Collection und die Info ob Auswärts, Heimwärts usw. müsstest du dann ins Ranking einbauen.

Lg, XXX

19.07.2012 - 09:27 Uhr

Das Problem hat sich irgendwie erübrigt...

... ich wollte mittels Powershell Script und Process.CloseMainWindow() die Applikation schließen, was aber nicht funktioniert da diese kein Window besitzt(im Normalzustand). Ich wollte nicht gleich über Process.Kill() gehen weil der Weg etwas hart wirkt aber für diese TrayIcon in dem Fall vollkommen ausreichend, da es außer einen laufenden Timer im Hintergrund nichts macht außer warten. Beim Herunterfahren schließt es sich dagegen normal und blockiert Windows nicht, was ursprünglich meine Befürchtung und der Grund für den Thread war, somit hat sich das Problem jetzt erübrigt.

Bzgl. deines Hinweises 7.e.Q - ein manuelles Beenden wäre ja nicht das Problem gewesen ich aber ich wollte wie erwähnt die Applikation von außerhalb schließen lassen was aber ohne Window nicht funktioniert außer wie gesagt durch Process.Kill()

Lg, XXX

18.07.2012 - 17:34 Uhr

Hallo,

ich habe gerade ein Problem mit einem Program, dass sich durch Aufforderung von außen nicht schließt:

Es handelt sich dabei um ein Program das nur ein NotifyIcon anzeigt und bei Bedarf auch mal Windows aber prinzipiel wird es durch Application.Run() gestartet und hat dadurch kein "MainWindow" mit dem es sich schließen soll.

Mit welchen Events bekomm ich mit, dass dieses Program geschloßen werden muss, damit ich dann dort Application.Exit() aufrufen kann?

Vielen Dank für jede Hilfe,

XXX

10.07.2012 - 15:28 Uhr

Nachdem ein implizierter Operator statisch ist wirst du ihn weder in einem Interface noch virtuell in einer Basisklasse definieren können.

Was aber gehen sollte, wäre den Operator in einer Basisklasse anzulegen und beim Konvertieren Methoden des übergebenen Objektes aufzurufen:

implicit

So in der Art


    public abstract class BaseClass
    {
        public static implicit operator int(BaseClass m)
        {
            return m.ConvertToInt();
        }

        protected abstract int ConvertToInt();
    }

    class BaseClassImpl : BaseClass
    {
        protected override int ConvertToInt()
        {
            return 5;
        }
    }

//Edit: Habs gerade getestet und tut auch das gewünschte. Natürlich gehören noch ein paar Checks rein aber das ist ein anderes Thema.

05.07.2012 - 10:16 Uhr

Hallo thorran,

was ist deine DataSource? Ein Array von was? Oder doch ein Datatable?

Bei einem DataTable würd ich dessen DefaultView dafür verantwortlich machen. Wenn dem so ist, kannst du für jede ComboBox eine neue DataView mit dem DataTable als Parameter erstellen und dann sollte die Navigation der ComboBoxen entkoppelt sein.

Lg, XXX

04.07.2012 - 16:38 Uhr

Die Besitzerspalte:

 
ID  |  CollectionID  |  AccountID | IstBesitzer
---------------------------------------
 1  |  5             |  1     | Ja

 2  |  5             |  7     | Nein
 3  |  5             |  3     | Nein
 4  |  5             |  10    | Nein
 5  |  5             |  5     | Nein

 6  |  6             |  2     | Ja

 7  |  6             |  15    | Nein
 8  |  6             |  37    | Nein
 9  |  6             |  562   | Nein
10  |  6             |  4     | Nein

Ich möchte an dieser Stelle auch erwähnen, dass deine Namensgebung etwas unschön ist und man daraus schwer ein System verstehen kann. Gib den Tabellen sprechende Namen - was soll eine TextCollection sein?

Du meinst jeder Account kann zusätzlich mehrere Texte abspeichern? Dann erstellst du dazu eine neue Tabelle die für die Texte zuständig ist:


ID  |  AccountID  |  Text
----------------------------
 1   |        1         |  bla
 2   |        1         |  anderer Text usw.

Und mittlerweile muss ich auch noch auf [Hinweis] Wie poste ich richtig? 1.1.1 Nicht nach Grundlagen fragen hinweisen. Deine Probleme hier sind alle der Natur mangelndes Verständnis relationaler Datenbanken. Lies dich vielleicht zur Unterstützung in das Thema ERM ein.

Lg, XXX

04.07.2012 - 16:09 Uhr

Wenn du einen Besitzer wissen willst, kannst du eine weitere Spalte einführen, welches diesen kennzeichnet.

Dein zweites Problem hört sich nach einem neuen Problem an, welches mit dem ersten nichts zu tun hat.

Prinzipiell empfiehlt es sich schon wenn man mit Datenbanken arbeitet auch die Grundlagen von Entities und Relations kurz ERM zu verstehen.

In Linq2Entities würde so eine Abfrage dann ca. so aussehen:

Account hans = .... //Lade Hans 

IEnumerable<Account> freunde = hans.CollectionAccount.Accounts;

oder


IEnumerable<Account> freundeVonHans = dataContext.Accounts.Where(a=>a.Name=="Hans").SelectMany(a=>a.CollectionAccount.Accounts);

Lg, XXX

04.07.2012 - 15:30 Uhr

Nein, siehe mein "edit"^^.

Die Abfrage, welcher Account ist mit wem befreundet sieht dann so aus:


select a1.*
from Account a1
join CollectionAccount ca1 on ca1.AccountID=a1.ID
join CollectionAccount ca2 on ca1.CollectionID=ca2.CollectionID and ca1.AccountID<>ca2.AccountID
join Account a2 on ca2.AccountID=a2.ID
where a2.Name='Hans'

und schon bekommst du alle Freunde von Hans.

Lg, XXX

04.07.2012 - 15:14 Uhr

Ich glaub jetzt hab ich dich verstanden:

Du hast aus meiner Sicht nur ein Beziehungsproblem bei der ersten Tabelle:



ID  |  Name
------------
 1  |  Hans
 1  |  Niels


ID
---------------------------------------
 5
 6

 
ID  |  CollectionID  |  AccountID
---------------------------------------
 1  |  5             |  1

 2  |  5             |  7
 3  |  5             |  3
 4  |  5             |  10
 5  |  5             |  5

 6  |  6             |  2

 7  |  6             |  15
 8  |  6             |  37
 9  |  6             |  562
10  |  6             |  4

und die Beziehungen sehen dann genau so wie die Spaltenbezeichnungen aus:

CollectionAccount.CollectionID=>Collection.ID
CollectionAccount.AccountID=>Account.ID

Lg, XXX

/EDIT: Die Collection Spalte von der Account tabelle kannst du dir sparen, weil du den Account einfach auch in die Gruppe rein tust - siehe "hervorgehobene" Einträge in der CollectionAccount Tabelle

04.07.2012 - 14:24 Uhr

So ein System hab ich noch nie gesehen und es macht auch (zumindest in dem kleinen Beispiel hier) für mich keinen Sinn.

Was du hier erreichen willst ist eine klassische M:N Beziehung, welche durch eine Beziehungstabelle abgebildet wird:


ID  |  Name 
--------------
 1  |  Hans  
 1  |  Niels  


ID1  |  ID2
--------------
 5    |    7
 5    |    3
 5    |    10
 6    |    15
 6    |    37
 6    |    562
 6    |    4

Und die Beziehung wäre:

Friendcollection.ID1 -> Account.ID

und

Friendcollection.ID2 -> Account.ID

somit kann jeder Account beliebig viele andere Accounts als Freund haben. 😃

Lg, XXX

04.07.2012 - 08:31 Uhr

Du kannst hier eine Überladung der Methode schreiben damit sie auch einen string entgegen nimmt und in der parst du den string und gibst rufst damit wiederum die erste Methode auf.

Lg, XXX

03.07.2012 - 12:08 Uhr

Hallo LuciLuke,

mit Regex könntest du das sicherlich gut abfragen und gleich zum Auswerten aufbereiten:


(?<Instruktion>benenne|erstelle)\s+(?<Subjekt>Disk|Folder)\s+(?<Name>(?:.(?!v))+)\s+(?<Preposition>vor|nach)\s(?<Wert>.*)

Die Gruppen sind benannt und haben die von dir gewünschte Reihenfolge.

Testen kannst du Regex Ausdrücke ausgezeichnet mit dem Tool hier: On-the-fly Regex-Tester: Regex-Lab

In C# kannst du dann ganz einfach auf die entsprechenden Gruppen der Reihe nach zugreifen und auswerten.

Lg, XXX

30.05.2012 - 23:21 Uhr

Eine reine XAML Lösung kann ich dir dazu nicht bieten aber hier ein Ansatz, wie ich es mit einem im MVVM umsetzen würde:

Du erstellst ein Attached Dependency Property wie folgt oder so ähnlich:


    public class ListBoxDoubleClickBehavior
    {
        private readonly ListBoxItem _item;
        private readonly ICommand _command;

        private ListBoxDoubleClickBehavior(ListBoxItem item, ICommand command)
        {
            _item = item;
            _command = command;

            _item.Loaded += ItemLoaded;
            _item.Unloaded += ItemUnloaded;
        }

        private void ItemLoaded(object sender, RoutedEventArgs e)
        {
            _item.MouseDoubleClick += ItemMouseDoubleClick;
        }

        private void ItemUnloaded(object sender, RoutedEventArgs e)
        {
            _item.MouseDoubleClick -= ItemMouseDoubleClick;
        }

        private void ItemMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (_command.CanExecute(_item.DataContext))
                _command.Execute(_item.DataContext);
        }



        public static readonly DependencyProperty DoubleClickCommandProperty =
            DependencyProperty.RegisterAttached("DoubleClickCommand", typeof(ICommand), typeof(ListBoxDoubleClickBehavior),
            new FrameworkPropertyMetadata(default(ICommand), DoubleClickPropertyChangedCallback));

        private static void DoubleClickPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            new ListBoxDoubleClickBehavior((ListBoxItem)d, e.NewValue as ICommand);
        }

        public static void SetDoubleClickCommand(UIElement element, ICommand value)
        {
            element.SetValue(DoubleClickCommandProperty, value);
        }

        public static ICommand GetDoubleClickCommand(UIElement element)
        {
            return (ICommand)element.GetValue(DoubleClickCommandProperty);
        }
    }

im XAML fügst du das Property dann per Style ans ListboxItem an:


        <ListBox ItemsSource="{Binding Path=Items}">
            <ListBox.Resources>
                <Style TargetType="ListBoxItem">
                    <Setter Property="YourNameSpace:ListBoxDoubleClickBehavior.DoubleClickCommand"
                            Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, 
                                    Path=DataContext.YourViewModelDoubleClickCommand}"/>
                </Style>
            </ListBox.Resources>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" >
                        <CheckBox IsChecked="{Binding Path=IsMyCheckBoxChecked}"/>
                        <TextBlock Text="{Binding Path=NameOfMyListBoxItem}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Und in deinem ViewModel kannst du dann im Command ganz bequem tun und lassen was du willst wie zum Beispiel das ViewModel deines ListBoxItems manipulieren:


            YourViewModelDoubleClickCommand = new DelegateCommand(item =>
                    item.IsMyCheckBoxChecked = !item.IsMyCheckBoxChecked);

Lg und viel Spaß beim Werken,

XXX

15.02.2012 - 00:58 Uhr

Hallo herbivore,

stimmt, natürlich ist das Thema komplexer. Ich hab mir bei meiner Antwort nur die Zahlenwerte und das eine ungleiche Paar angesehen und hab daraus geschlossen, dass die Suche nach solch einem Unterschied recht einfach zu implementieren sei. Wenn man andere Kriterien für die Gleichheit heranzieht, funktioniert dieser Ansatz vermutlich nicht mehr so gut.

Lg, XXX

14.02.2012 - 23:59 Uhr

Rekursionen stell ich mir vor wie das Auslagern einer Teilberechnung einer Methode. Diese ausgelagerte Methode ist dann zufällig die selbe und wird halt nur mit anderen Parametern aufgerufen.

In dem Context der Methode sollte dich fast nur der Inhalt der Methode interessieren und nicht, was alle darauffolgenden Methodenaufrufe alles vollziehen.
Du musst dich also in die Methode hineinversetzen und versuchen deine Aufgabe zu erfüllen. Dabei wird eine unter-methode aufgerufen(sich selbst) und die liefert "irgendein" ergebnis, mit dem man weiterarbeiten kann oder nicht.

Ein rekursive Methode hat natürlich mehrere Aspekte und man muss sich jeden gesondert durchdenken. Aber das ganze auf einmal im Kopf zu haben ist mMn. nicht notwendig.

Wenns an der Verständlichkeit happert, ist die Methode eventuell nicht aussagekräftig genug gestaltet. Wenn die Methode einem versätndlichen Zweck dient, einen aussagekräftigen Namen hat und logisch Parameter mitführt, wird die Verwendung auch gleich viel klarer.

Vielleicht hilft das ja was 😃

Lg, XXX

14.02.2012 - 23:03 Uhr

Ich würd einmal annehmen, dass der Graph identisch ist, wenn alle Knoten identisch sind. Wo ist das Problem dabei den Graphen Knoten für Knoten zu vergleichen und auf unterschiede zu prüfen? Evt. musst du in unterschiedliche Richtungen suchen und bei einem Kreis dir merken, welche Knoten du schon geprüft hast.

Wenn du technische Probleme bei der Umsetzung hast, zeig was du bisher probiert hast und erklär woran du scheiterst.

Lg, XXX