Laden...

Forenbeiträge von Amosius Ingesamt 31 Beiträge

08.08.2012 - 11:17 Uhr

Hallo,

vielen Dank an alle, es hat funktioniert und ich habe nun auch
die Hürde gefunden.

Mein aktueller Code mit dem es funktioniert:


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Timeout = timeout;
            request.UserAgent = userAgent;
            request.PreAuthenticate = true;
            request.UseDefaultCredentials = true;

            request.Proxy = WebRequest.GetSystemWebProxy();

            if (null == proxy_credentials)
            {
                request.Proxy.Credentials = CredentialCache.DefaultCredentials;
            }
            else
            {
                request.Proxy.Credentials = this.proxy_credentials;
            }

Bislang habe ich immer die DefaultCredentials
für den request selbst gesetzt, aber nicht für den proxy im request. Nun setze ich
beides, einmal über UseDefaultCredentials und im Proxy nochmal. Letzter Schritt
hatte bislang gefehlt.

Danke an alle.

Amosius

07.08.2012 - 18:01 Uhr

Danke für eure Hinweise,

ich teste das beim Kunden und gebe euch eine Rückmeldung wie
es gelaufen ist.

Grüße
Amosius

07.08.2012 - 13:35 Uhr

Hallo MarsStein,

habe ich getestet. Das Anwendungsverhalten hat sich leider nicht verändert.

Weitere Hinweise?

Grüße
Amosius

07.08.2012 - 10:24 Uhr

Hallo,

ich habe ein Programm mit dem ich einen Webrequest durchführe. Dazu möchte ich die Proxy Einstellungen des Internet Explorers vewenden und auch die Credentials des angemeldeten Users.


HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Timeout = timeout;
request.UserAgent = userAgent;
request.PreAuthenticate = true;

if (manualCredentials)
{
   request.Proxy.Credentials = this.proxy_credentials;
}
else
{
   request.UseDefaultCredentials = true;
}

HttpWebResponse res = (HttpWebResponse)request.GetResponse();

Problem 1: Hat der Anwender einen Proxy, so wirft die GetResponse-Methode eine Exception mit HTTP Statuscode 407 Proxy Authentifizierung notwendig. Nun frage ich mich warum der User nicht mitgegeben wird (default credentials)?

Problem 2: Aktuell fange ich den Fehler ab und zeige einen Dialog zur Eingabe von Name und Passwort an. Dann führe ich einen weiteren Request durch und setze die credentials manuell, bekomme dann aber einen HTTP Statuscode 400 (Bad Request - Die Anfrage-Nachricht war fehlerhaft aufgebaut).

Wie kann ich am einfachsten die Einstellungen des Internet Explorers mit dem angemeldeten Anwender verwenden?

Danke für eure Hilfe.

Amosius

10.02.2012 - 13:58 Uhr

Hallo zusammen. Ich habe eine Druckmethode die auch entsprechend funktioniert.

            
System.Printing.PrintDocumentImageableArea ia = null;
System.Windows.Xps.XpsDocumentWriter w = System.Printing.PrintQueue.CreateXpsDocumentWriter(ref ia);

            if (w != null)
            {
                // set size on one page

                DiagramPaginator dp = (DiagramPaginator)myControl.DocumentPaginator;
                dp.PageSize = GetPageSize();

                // get print ticket

                LocalPrintServer printServer = new LocalPrintServer();
                PrintQueue printQueue = printServer.DefaultPrintQueue;
                PrintTicket ticket = printQueue.UserPrintTicket;
                
                // set ticket properties

                ticket.PageOrientation = PageOrientation.Landscape;
                

                Size pageSize = GetPageSize();
                pageSize.Width = pageSize.Width / 0.96;
                pageSize.Height = pageSize.Height / 0.96;

                // set page media size does have no effect -> bug

                ticket.PageMediaSize = new PageMediaSize(pageSize.Width, pageSize.Height);
                
                w.Write(dp, ticket);
            }

Wenn ich per PageMediaSize eine vordefiniertes Papierformat angebe, dann wird
mein Druck auch in dem Format erstellt. Bei der Konstrukturvariante der variablen Breite und Höhe erhalte ich meinen Ausdruck immer in A4 (Standard vom Drucker).

Weiss jemand woran das liegen könnte?

30.01.2012 - 10:00 Uhr

Hallo zusammen,

vielen Dank für Eure antworten und damit die Impulse für die Weiterentwicklung.
Ich setze das Thema auf erledigt.

Viele Grüße,
Amosius

26.01.2012 - 16:39 Uhr

Hallo JuyJuka,

danke für die Info.
Aktuell überlege ich mir, ob ich eine Klassenbibliothek erstelle mit gemeinsamen Funktionalitäten und drei separaten Projekten. Wäre zumindest eine übersichtliche Aufteilung.

26.01.2012 - 14:31 Uhr

Hallo zusammen,

ich möchte mein Programm gerne in verschiedene Editionen unterteilen.
Also z.B. Light, Standard und Professional.

D.h. dass die Professional bspw. eine etwas andere GUI besitzt mit mehr Funktionen, die in den anderen beiden Editionen nicht vorhanden sind. Weiterhin kann es sein, dass bei Aufruf von Funktionen zusätzliche Dialoge erscheinen, in denen der Anwender weitere Einstellungen vornehmen kann.

Zusätzlich hat mein Projekt einige Verweise auf DLLs, die ich je nach Edition eben benötige oder nicht.

Welche "unkomplizierten" Lösungsmöglichkeiten habe ich bei der Erstellung in Microsoft Visual Studio. Ich vermute, dass die Verwendung von unterschiedlichen Projekten sehr viel redundanter Code bedeutet?!

Über die Suche bin ich nicht fündig geworden. Freue mich über "unkomplizierte" Lösungsansätze

Amosius

13.09.2011 - 10:56 Uhr

Hallo, ich habe weitere Einschränkungen vorgenommen.

Ich möchte eine TreeView mit folgendem Typeninhalt aufbauen.
Ich habe eine Collection mit 3 Subcollections verschiedenen Typs (wobei die Reihenfolge immer gleich ist). Der letzte der 3 Subcollections hat wiederrum 2 Collections.

Ich habe also folgende Struktur:

+Rootnodecollection (Type Root)
++Systemcollection (Type System)
++Documentcollection (Type Document)
++Foldercollection (Type Folder)
+++SystemCollection (Type System)
+++DocumentCollection (Type Document)

Jetzt versuche ich das ganze über HierarchicalTemplates aufzubauen und jeden Datentyp zu definieren.
In dem Datentyp Root definiere ich dass es 3 Subcollections gibt.
Die weiteren DataTemplates definieren wie diese angezeigt werden sollen.
Schaut dann so aus:

		<Grid.Resources>
		
            <HierarchicalDataTemplate DataType="{x:Type local:System}" >
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>                
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type local:Document}" >
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type local:Folder}" >
			    <HierarchicalDataTemplate.ItemsSource>
                    <Binding>
                        <Binding.Source>
                            <CompositeCollection>
                                <CollectionContainer x:Name="FolderSystem" Collection="{Binding Path=Systems}" /> <!--Collection1 Type=local:System -->
                                <CollectionContainer x:Name="FolderDocument" Collection="{Binding Path=Documents}" /> <!--Collection1 Type=local:Document -->
                            </CompositeCollection>
                        </Binding.Source>
                    </Binding>
                </HierarchicalDataTemplate.ItemsSource>
                <TextBlock Text="{Binding Path=Text}" />
            </HierarchicalDataTemplate>
            
            <HierarchicalDataTemplate DataType="{x:Type local:Root}">
                <HierarchicalDataTemplate.ItemsSource>
                    <Binding>
                        <Binding.Source>
                            <CompositeCollection>
                                <CollectionContainer x:Name="MainSystems" Collection="{Binding Path=Systems}" /> <!--Collection1 Type=local:System -->
                                <CollectionContainer x:Name="MainDocuments" Collection="{Binding Path=Documents}" /> <!--Collection1 Type=local:Document -->
								<CollectionContainer x:Name="MainFolder" Collection="{Binding Path=Folder}" /> <!--Collection1 Type=local:Folder -->
                            </CompositeCollection>
                        </Binding.Source>
                    </Binding>
                </HierarchicalDataTemplate.ItemsSource>
                <TextBlock Text="{Binding Path=Name}" />
            </HierarchicalDataTemplate>
            
        </Grid.Resources>

        <TreeView 
            x:Name="multipleTreeViewTarget" 
            BorderBrush="Gray" 
            BorderThickness="1" >
            <TreeView.ItemsSource>
                <CompositeCollection>
                    <CollectionContainer x:Name="RootCollection" />
                </CompositeCollection>
            </TreeView.ItemsSource>
        </TreeView>

Bin ich da auf der richtigen Spur? Kann ich eine CompositeCollection in einem HierarchicalTemplate verwenden?

Amosius

12.09.2011 - 19:08 Uhr

Hallo,

ich binde eine ObservableCollection<object> an eine TreeView in einem Dialog:

treeViewTarget.ItemsSource = multipleTreeViewTargetData;

Rufe ich diesen Dialog aus meinem Hauptfenster aus, so erhalte ich folgende Exception:

"Das angegebene untergeordnete Element muss vom aktuellen übergeordneten Visual-Objekt getrennt werden, bevor es an ein neues übergeordnetes Visual-Objekt angefügt wird."

Ist die Collection leer, kann ich den Dialog öffnen. Die Observable Collection die ich öffnen möchte ist bereits im Hauptfenster gebunden. Im Dialog selbst möchte ich daran nichts verändern, nur eben die Daten nochmals anzeigen. Liegt es am doppelten Binding oder wie kann ich mit der Collection umgehen?

Amosius

24.08.2011 - 16:18 Uhr

Hallo talla,

danke für die Info, propier ich aus.
Ich schliesse den Thread von meiner Seite aus.

Grüße,
Amosius

24.08.2011 - 14:56 Uhr

Hallo und danke für die Anregungen. Ghost Cursor gefällt mir nicht da der Mauszeiger vollständig durch das Bild ersetzt wird. Fällt also leider raus.
Der Adorner Eintrag von Bea Stollnitz unterstützt kein ContentControl, werde es aber anschauen und wohl eine eigene Adorner Variante bauen.

Jemand noch eine Idee wie es mit dem Popup klappen könnte? 😃

Amosius

24.08.2011 - 11:10 Uhr

Für eine drag / drop operation möchte ich ein Popup mit einem child vom Typ Image unter dem Mauszeiger anzeigen (ähnlich wie bei einem Verschieben von Dateien im Windows Explorer).

Solange das Popup offen ist erkennt der Mauszeiger nicht mehr dass er sich auf dem richtigen Control für das drop event befindet.

Ich möchte nun dass für die Maus das Popup nicht existent ist. Ich habe hierzu
für das Popup als auch für das Image IsHitTestVisible = false gesetzt.

        <Popup x:Name="myPopup"
               IsHitTestVisible="False" 
                Focusable="False"
               IsEnabled="False"
                IsManipulationEnabled="False"
               Placement="RelativePoint"
               PlacementTarget="{Binding ElementName=myWindow}"
               HorizontalOffset="-40"
               VerticalOffset="-40"
               AllowsTransparency="True" >
               <!--Set image from resource dictionary in code-->
            
               <Image x:Name="myPopupImage" IsHitTestVisible="False" Focusable="False" IsManipulationEnabled="False" />
        </Popup>

Wenn ich beim Image Visibility=Hidden setze, dann funktioniert es, aber dann sieht der Anwender das Bild ja auch nicht mehr 😃

Amosius

13.05.2011 - 11:44 Uhr

Ich schließe das Thema. Dank für die Antwort MarsStein.

Grüße, Amosius

02.05.2011 - 14:34 Uhr

Hallo MarsStein,

jo hatte ich mir auch überlegt. Ganz schick finde ich es nicht.
Naja ich werde es mal so umsetzen und anschauen.

Noch weitere Anregungen? 😃

Grüße,
Amosius

02.05.2011 - 12:26 Uhr

Hallo,

ich habe ein Webbrowsercontrol in dem ich eine HTML Datei anzeigen lassen möchte, also nichts wirklich spannendes.

Hierzu habe ich eine HTML-Datei (die später mehrsprachig existieren soll) mit einigen Bildern.
Diese HTML-Datei sowie die Bilder habe ich als "Embeded Resource" in das Projekt mit aufgenommen.

Nun möchte Ich die HTML-Seite mit den Bildern anzeigen lassen.

Variante 1: Ich lese die HTML Datei als Stream aus und übergebe den Stream anschließend meinem Webbrowser-Control:

var streamHTML = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(
            "MeinProjekt.Resources.Manual.htm"
            );

Die Bilder können natürlich nicht zugeordnet werden, daher sehe ich nur den Text.

Variante 2: Ich erstelle eine HTML Datei mit Inline Grafiken. Ich habe aus Word eine Datei als .mht / .mhtml erstellt. Das Webbrowsercontrol kann dies jedoch nicht vernünfigt anzeigen.

Variante 1 würde mir gut gefallen, da ich später die HTML-Seite mit unterschiedlichen Sprachen hinterlegen und auf die gleichen Bilder verweisen könnte. Wie bekomme ich es aber hin, dass der Stream auf die eingebetteten Bilder verweisen kann?

Viele Grüße,
Amosius

30.11.2010 - 12:04 Uhr

Hallo,

vielen Dank für die Antworten.
Die Anwendung .Netz habe ich auf mein .NET Framework kompiliert. Leider war die Anwendung nach dem Zusammenfügen nicht mehr ganz die gleiche (Icons in der Anwendung waren verschwunden...).

ich habe aus Komfortgünden die folgende Funktion in die App.xaml.cs eingefügt,
die mir bei jedem kompilieren direkt eine fertige Executable erstellt:

        static App()
        {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {
                Console.WriteLine(new System.Reflection.AssemblyName(args.Name).Name);


                String resourceName = "MeinAnwendungsname." +

                    new System.Reflection.AssemblyName(args.Name).Name + ".dll";

                using (var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {

                    Byte[] assemblyData = new Byte[stream.Length];

                    stream.Read(assemblyData, 0, assemblyData.Length);

                    return System.Reflection.Assembly.Load(assemblyData);

                }

            };
        }       

Den Beitrag schliesse ich. Vielen Dank nochmals.

23.11.2010 - 00:09 Uhr

Hallo JuyJuka,

vielen Dank, probiere ich aus.

Weiterhin würde ich gerne auch mal mein oberes Beispiel zum Laufen bringen.
Eine Idee woran das liegt?

Viele Grüße,
Amosius

22.11.2010 - 15:42 Uhr

Über den Artikel von Jeffrey Richter (hier der Artikel) bin ich auf die AssemblyResolve-Variante für meine Anliegen gestossen.
Habe die Historie des Forums und etliche Google Anfragen gestartet, leider ohne Erfolg. Vielleicht könnt ihr mir einen Rat geben:

Ich möchte gerne diverse Dlls von Drittanbietern in eine EXE einer WPF-Anwendung integrieren, analog dem oben genannten Artikel. Hierzu soll die DLL in die EXE eingebunden werden und durch das AssemblyResolve Event gefunden werden.

Meine Vorgehensweise:
Ich habe zusätzlich zum Verweis der DLL die Dll selbst zum Projekt hinzugefügt (hinzufügen -> vorhandenes Element) und den Build-Vorgang auf eingebettete Ressource umgestellt.

Folgenden Code habe ich verwendet:

using System;
using System.Reflection;
using System.Collections.Generic;
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 Simple
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {

            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {

                String resourceName = "AssemblyLoadingAndReflection." +

                   new AssemblyName(args.Name).Name + ".dll";

                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {

                    Byte[] assemblyData = new Byte[stream.Length];

                    stream.Read(assemblyData, 0, assemblyData.Length);

                    return Assembly.Load(assemblyData);

                }

            };

            InitializeComponent();



            Test();

        }

        private void Test()
        {
            DLLClass Test = new DLLClass(); //hierzu ist die DLL notwendig
        }

    }
}

Ich bin mir nicht sicher ob die Position von AssemblyRessolve in dieser WPF-Anwendung die richtige ist. Zumindest wird diese ausgeführt, bevor
das Testobject initiiert wird.

Nun gehe ich in mein Debugverzeichnis und lösche die DLL, die das Programm ja benötigt. Die Anwendung kann ohne die DLL nicht ordnungsgemäß gestartet werden, obwohl ich an der Dateigröße der EXE sehe, dass die dll integriert sein muss.

Ich nehme an, dass ich das AssemblyResolve Event woanders hinterlegen muss?

Bin für Hinweise dankbar.

Amosius

07.10.2010 - 17:51 Uhr

Hallo Christian,

danke für die Nachfrage.

Ich bin noch am experimentieren und einlesen.
Ich habe das Property in der Klasse App.cs definiert.
Das Binding mit folgendem Code funktinioniert:

Title="{Binding Path=strKontaktName, Source={x:Static pm:App.Current}}"

Das Property in der der Datei Kontakt.xaml.cs mit der Klasse Kontakt und
folgendes Binding:

Title="{Binding Path=Kontakt.strKontaktName, Source={x:Static pm:App.Current}}"

oder Alternativ:

Title="{Binding Path=Kontakt.strKontaktName, Source={x:Static pm:App.Current}}"

geht zwar noch nicht. Aber ich forste mal weiter. Die Denkanstösse fand ich schon gut
und mit jedem Tag verfliegt ja etwas Nebel und die Zusammenhänge werden klarer.

07.10.2010 - 10:34 Uhr

Hallo ErfinderDesRades. Vielen Dank, konnte nun gelöst werden. Ich versuche die Qualität meiner Fragen zu erhöhen 🙂 und schliesse den Beitrag.

06.10.2010 - 18:34 Uhr

Hallo MrSparkle,

vielen Dank. Ich lerne die Zusammenhänge und die gegenseitigen Referenzierungen besser zu verstehen.

Ich teile aktuellen Stand mit, bin für jeden Hinweis dankbar.

Im Objekt App.cs habe ich folgendes definiert:

<Application x:Class="Kontaktanwendung.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:pm="clr-namespace:Kontakte"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Kontakt.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>

Der Anfang der XAML Datei ist wie folgt aufgebaut (sollte so stimmen):

<r:RibbonWindow 
    Name="rwKontakte"
    x:Class="Kontakte.Kontakt"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
....

Das Binding wird wie folgt definiert:


Title="{Binding Path=strKontaktName, Source={x:Static pm:App.Current}}"

In der Datei Kontakt.xaml.cs habe ich eine Klasse Kontakt.
In dieser ist Testweise folgendes definiert:

public string strKontaktName = "Müller";

In der Ausgabe wird aufgeführt, dass das Objekt nicht gefunden wird:

 System.Windows.Data Error: 40 : BindingExpression path error: 'strKontaktName' property not found on 'object' ''App' (HashCode=63433729)'. BindingExpression:Path=strKontaktName; DataItem='App' (HashCode=63433729) 
05.10.2010 - 16:59 Uhr

Hallo MrSparkle,

ja genau, um das Avalon-Dock Framework geht es. Ich habe einige Bindings bei mir die ich nach der Anleitung umstellen möchte. Eine Fehlermeldung erhalte ich nicht.

Ich möchte gerne den Titel des Avalon-Dock Fensters an eine Variable binden.
Das hat auch so funktioniert:

.. Title="{Binding strKontaktName}"

Den DataContext setze ich im Code:

KontaktDetails.Datacontext = MeineKontakte;

Das Framework hat aber das Problem, dass bei einer abkopplung der Datacontext verloren geht, es verschwindet also der Name. Der Titel ist nach Abkopplung leer. Als Lösung ist vorgeschlagen, das Binding komplett in XAML durchzuführen.

Meines erachtens muss ich Klassenname, Objektname und Eigenschaft mitgeben. Mache ich das nach folgendem Schema ist der Titel nicht nur nach der Abkopplung leer, sondern von Anfang an. D.h. das Binding kann kein einziges mal erfolgen.

Title="{Binding Path=<Klassenname>.<Objektname>.<Eigenschaft>, Source={x:Static App.Current}}"

Eine Fehlermeldung wie gesagt wird nicht produziert, die Anwendung startet aber der Titel wird nicht gesetzt und ist leer.

04.10.2010 - 18:23 Uhr

Bei mir nicht.... mit Application.Current erhalte ich ne Fehlermeldung:

Fehler 1 Der Typ "Application"wurde nicht gefunden. Beachten Sie, dass bei Typnamen die Groß- und Kleinschreibung berücksichtigt wird.

Mit Appl.Current geht es. Ich habe aber z.T. gelesen dass manche Application.Current verwenden. Kann also sein dass das bei dir geht 😃

Bei mir schluckt er zwar Appl.Current, aber leider erhalte ich nicht das gewünschte Ergebnis. Bin nicht sicher ob ich da noch nen grösseren Denkfehler habe....

04.10.2010 - 16:13 Uhr

Hallo Michael,

das MVVM Pattern versuche ich anzuwenden 😃

Cinch und Caliburn kannte ich nicht. Schau ich mir mal an.

Für einen konkreten Fall möchte ich gerne das Binding komplett in XAML vornehmen.
Folgendes Statement wird zwar kompiliert, aber ich erhalte noch nicht das Binding:

Title="{Binding Path=MeineKlasse.MeineEigenschaft, Source={x:Static MeinNamespace:App.Current}}"

Kann das überhaupt so gehen?

01.10.2010 - 17:37 Uhr

Hallo, ich seh gerade den Wald vor lauter Bäume nicht....

Ich habe ein Binding in XAML das auch funktioniert
Geht:

... Title="{Binding strName}" > 

ich habe ein Datacontext erstellt und so funktioniert die Bindung auch.

Aufgrund eines Frameworks, welches mir empfiehlt aus Buggründen die vollständige Definition in XAML vorzunehmen, möchte ich die Bindung nun umstellen auf XAML und habe folgendes Ziel (war als Beispiel dabei)
Beispiel:

ItemsSource="{Binding Path=MainWindow.SampleCollection, Source={x:Static local:App.Current}

Nun möchte ich das analog für mein Binding erstellen.

Ich habe ein Editor.xaml und ein Editor.xaml.cs.
Im Editor.xaml.cs ist folgendes Element der Klasse Kontakt:

Kontakt MeinKontakt = new Kontakt("Müller");

Nun möchte ich auf diesen Namen per Binding zurückgreifen, analog dem oben erwähnten Code mit "Source=..."

Ich würde nun soetwas vermuten, aber da irre ich mich.
Geht nicht:

...Title="{Binding Editor.Kontakt.strName, Source={x:Static Application.Current}}" >
22.09.2010 - 15:32 Uhr

Hallo Michael,

danke für die Denkanstösse 😃 Mit RemoveAt habe ich den Fehler finden können.

Ich schliesse das Thema. Vielen Dank an Dich!

22.09.2010 - 14:33 Uhr

Hallo Michael,

vielen Dank für deine Antworten.

zu 1) Erledigt - Stimmt 🙂

zu 2) Erledigt - Konnte mit Frage 1 behoben werden.

zu 3) Ergänzende Erläuterung: Wenn ich ein Element verändere (ausserhalb des DataGrids) dann erhält mein DataGrid automatisch ein Update und das Property wird mit dem korrekten aktuellen Wert angezeigt. Füge ich ausserhalb des DataGrids ein Element hinzu, wird dies im DataGrid mit angezeigt. Lösche ich ein Element ausserhalb des Datagrids, sehe ich das Objekt weiterhin im DataGrid.

Mit dem Binding bin ich noch nicht wackelfest.
Frage zum Binding: Mit deinem Hinweis verändere ich das Binding des DataGrids wie folgt:

<DataGrid Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=?, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="Summary" CanUserSortColumns="True" Style="{StaticResource styleDataGrid}" ColumnHeaderHeight="40">

Für Mode und UpdateSourceTrigger benötige ich den Path. Bislang habe ich im Path ein konkretes Property angegeben. Welche Bezeichnung wird erwartet? Am meisten Sinn würde doch der Name der Observable Collection machen, die ist aber doch kein Path?!

22.09.2010 - 11:04 Uhr

Ich habe eine Observeable Collection und setze eine Binding:

Summary.DataContext = ocMyCollection;

Meine GUI hat folgendes DataGrid:

<DataGrid Grid.Column="0" Grid.Row="0" ItemsSource="{Binding}" Name="Summary" CanUserSortColumns="True" Style="{StaticResource styleDataGrid}" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" ColumnHeaderHeight="40">
                                    <DataGrid.Columns>
                                      <DataGridTextColumn Header="Name" Binding="{Binding Path=Text}" Width="Auto" />
                                      <DataGridTextColumn Header="Tage" Binding="{Binding Path=iDurationDays}" Width="Auto" />
                                       <DataGridTextColumn Header="Stunden" Binding="{Binding Path=iDurationHours}" Width="Auto" />
                                       <DataGridTextColumn Header="Minuten" Binding="{Binding Path=iDurationMinutes}" Width="Auto" />
                                    </DataGrid.Columns>
                                </DataGrid>
  1. Das Grid zeigt mir nicht nur die 4 gebundenen Eigenschaften der Elemente sondern zusätzlich noch alle Eigenschaften die das Element besitzt. Mein Verdacht liegt auf dem ItemsSource="{Binding}" im DataGrid. Lasse ich das weg, wird nichts mehr angezeigt. Ich möchte jedoch nur die 4 Eigenschaften anzeigen lassen, nicht alle Eigenschaften.

  2. Die Scrollbar VerticalScrollBarVisibility="Visible" ist zwar sichtbar aber nicht aktiv.

  3. Neue Elemente die der Observeable Collection hinzugefügt werden, werden auch im DataGrid aktualisiert angezeigt. Lösche ich ein Element aus der Observeable Collection wird dies nicht im DataGrid entfernt.

Im Vorraus besten Dank für Hinweise.

02.09.2010 - 11:26 Uhr

Hallo michIG, hallo zero_x,

vielen Dank für die Ideen. Mit deinen Informationen michIG hast du mir sehr weitergeholfen.

Ich würde gerne den Beitrag schliessen, kann ich das als User?

01.09.2010 - 17:51 Uhr

Ich habe eine WPF-Anwendung mit XAML und einer Textbox.

<TextBox Name="Name" Text="{Binding Source=Aufgabe, Path=aufgabenname, UpdateSourceTrigger=PropertyChanged}" />

So sieht die Klasse aus (reduziert):


class Aufgabe : INotifyPropertyChanged
    {
        string _aufgabenname;

        public Aufgabe()
        {
        }

        public string aufgabenname
        {
            get { return _aufgabenname; }
            set
            {
                _aufgabenname = value;
                OnPropertyChanged("aufgabenname");
            }
        }

        protected void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        } 

Ziel: Bei Auswahl einer Instanz (über eine grafische Oberfläche) soll die Eigenschaft in der Textbox dargestellt werden. Wählt der Anwender eine andere Instanz aus, so ändert sich der Inhalt der Textbox. Ist keine Textbox ausgewählt, so wird nichts in der Textbox angezeigt.

Das mit Source in der Textbox scheint noch nicht zu fruchten. Ich habe zwar über C# eine Bindung herstellen können, mit jeder Instanz wurde jedoch die Verbindung der vorhergehenden Instanz wieder aufgelöst.

Nach meinem Verständnis müsste dies über die Bindings recht komfortabel lösbar sein, ohne einzelne Implementierungen für Objekt ausgewählt, Objekt abgewählt etc.
Bislang habe ich sehr viel über Lösungen zu statischen Resourcen gefunden, aber bei diesem Fall fehlt mir der Best Practice Ansatz.