Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von xxxprod
Thema: DependencyProperty - Wie kann ich es verstehen?
Am im Forum: GUI: WPF und XAML

Welche Antwort erwartest du dir hier? Soll hier jemand das Konzept von DependencyProperties und WPF im Generellen für dich vorkauen? Vielleicht ließt du dir zuerst mal die Grundlagen dazu durch: DependencyProperties und stellst dann gezielt Fragen wenn du dich wo nicht auskennst.

Wenn du ein konkretes Problem hast, dann poste es auch und Frage gezielt nach einer Lösung.

Lg, XXX

Thema: Frage zu Binding eines DataTemplate zu ItemTemplate
Am im Forum: GUI: WPF und XAML

Ich kann nicht erklären warum, aber irgendwie wird die View "wegrationalisiert" oder so und ist anscheinend im VisualTree nicht vorhanden weswegen sie mit RelativeSource nicht aufspürbar ist.

Was aber gehen sollte ist zuerst die ListView suchen und dann über die View Eigenschaft wieder runterhangeln:

{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}}, Path=View.ItemWidth}


Lg, XXX

Thema: Frage zu Binding eines DataTemplate zu ItemTemplate
Am im Forum: GUI: WPF und XAML

Ich schaffs nicht auf nur irgendeine Weise deinen Fehler nachzustellen.

Was ist local:CPlainView für ein Control?
Ist ItemTemplate ein eigenes Property? Wenn ja wie definiert und wo und wie verwendet?

Lg, XXX

//PS: Der Fehler sagt eigentlich eh schon alles aus und drückt auch meine Vermutung aus: In deiner Objekthierachie ist anscheinend vom DockPanel bis zum Window rauf nirgends ein Element vom Typ CPlainView dazwischen. Zumindest bekomm ich nur in solchen Fällen diesen Fehler.

Thema: Frage zu Binding eines DataTemplate zu ItemTemplate
Am im Forum: GUI: WPF und XAML

Probier mal folgendes:

{Binding RelativeSource={RelativeSource AncestorType={x:Type local:CPlainView}}, Path=ItemWidth}


Lg, XXX

Thema: ListBox Item mit nur einer Komma Stelle anzeigen?
Am im Forum: GUI: WPF und XAML

In Bindings kann man auch ein StringFormat angeben.

Lg, XXX

Thema: Elegante Addressierung von Tabellen und Spalten
Am im Forum: Datentechnologien

ORM und im Speziellen zum Beispiel das ADO .NET Entity Framework sind Werkzeuge und Begriffe die du denke ich suchst.

Lg, XX

Thema: Generics: Für Constraint "where T : class" auch Nullable<T> erlauben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Leider verstehe ich noch immer nicht was du damit bezwecken willst. Ich kann mir nicht vorstellen in welchem Szenario ich eine generische Klasse brauche, die aber ein nicht generisches Interface implementiert.

Du musst darauf nicht eingehen. Ich kann nur nichts weiteres dazu beitragen da ich den Sinn und Zweck deines Vorhabens nicht verstehe.

Lg, XXX

Thema: Generics: Für Constraint "where T : class" auch Nullable<T> erlauben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wenn es ausschließlich intern verwendet wird, kannst du ja auch einfach object verwenden? So wie ich das verstehe, willst du einfach die Handhabung mit dem Generic Constraints einschränken. Das machen die zwei Methoden auch. Wie du die Objekte intern behandelst ist dann wieder eine andere Geschichte.

Lg, XXX

Thema: Generics: Für Constraint "where T : class" auch Nullable<T> erlauben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Dann wird wohl eine Überladung herhalten müssen. :)



        static void Main(string[] args)
        {
            //Foo(5); //error
            Foo((int?)5);
            Foo((int?)null);
            Foo("bar");
            Foo((string)null);
        }

        static void Foo<T>(T item) where T:class 
        {
            if (ReferenceEquals(item, null))
                Console.WriteLine("Item is null");
            else Console.WriteLine(item);
        }

        static void Foo<T>(T? item)where T:struct 
        {
            if (ReferenceEquals(item, null))
                Console.WriteLine("Item is null");
            else Console.WriteLine(item);
        }

Lg, XXX

Thema: Validation Rule
Am im Forum: GUI: WPF und XAML

Ich kenn das genau Verhalten von ValidationRules nicht und kann nicht beantworten warum sie nicht greifen wenn der Wert beim Start zugewiesen wird.

Alternativ könntest du auf IDataErrorInfo umsatteln. Diese prüfen bei mir immer vono beginn an.

Lg, XXX

Thema: Generics: Für Constraint "where T : class" auch Nullable<T> erlauben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von trashkid2000
Dumme Frage,
aber warum lässt Du das Constraint nicht ganz weg? Wenn eh alles als item übergeben werden kann. Allerdings sehe ich in diesem Konstrukt gar keinen Sinn, in Sachen Typsicherheit.
LG, Marko

Stimmt, du willst einschränken aber doch alles zulassen. Ohne Constraint funktionierts wunderbar:


        static void Main(string[] args)
        {
            Foo(5);
            Foo((int?)5);
            Foo((int?)null);
            Foo("bar");
            Foo((string)null);
        }

        static void Foo<T>(T item)
        {
            if (ReferenceEquals(item, null))
                Console.WriteLine("Item is null");
            else Console.WriteLine(item);
        }

Oder willst du was anderes erreichen?

Lg, XXX

Thema: Operatoren debuggen - Haltepunkt wird nicht erreicht
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Dr. Google empfiehlt folgenden Thread: Reflection and Operator Overloads in C#

Alternativ könntest du einfach ein Testprojekt schreiben in dem du einen Operator deklarierst und dich per Reflection und GetMethods zum Ziel durchhangelst?

Lg, XXX

//Edit: was aber nichts daran ändert, dass wenn deine Klasse irgendwo generisch verwendet wird, der Operator _nie_ greifen wird. Insofern ist es wohl sinnvoller das ganze mit der Operatorüberladung nochmals zu überdenken. Evt. ist deine Klasse besser als Struct implementiert bei dem automatisch beim Vergleich alle Member verglichen werden.

Thema: Operatoren debuggen - Haltepunkt wird nicht erreicht
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Das wird auch so nicht funktionieren. Wie du schon selbst irgendwo oben geschrieben hast, sind Operatoren statische Funktionen. Statische Funktionen unterliegen daher auch nicht den klassischen Vererbungsprinzipien sodass der Operator der in einer SubKlasse definiert wurde nicht aufgerufen wird, wenn er auf eine Basisklasse angewendet wird. Der Typ T in deinem Code ist abstrakter als der Typ der den Operator implementiert weswegen dieser nicht aufgerufen wird.


    class Program
    {
        static void Main(string[] args)
        {
            Sub a1 = new Sub();
            Sub b1 = new Sub();

            Console.WriteLine(a1 == b1); //prints "Operator in Sub called: ..."

            Test a2 = new Sub();
            Test b2 = new Sub();

            Console.WriteLine(a2 == b2); //prints "Operator in Test called: ..."

            object a3 = new Sub();
            object b3 = new Sub();

            Console.WriteLine(a3 == b3); //prints "..."
        }
    }

    public class Test
    {
        public static bool operator ==(Test test1, Test test2)
        {
            Console.Write("Operator in Test called: ");
            return Equals(test1, test2);
        }

        public static bool operator !=(Test test1, Test test2)
        {
            return !(test1 == test2);
        }
    }

    public class Sub : Test
    {
        public static bool operator ==(Sub test1, Sub test2)
        {
            Console.Write("Operator in Sub called: ");
            return Equals(test1, test2);
        }

        public static bool operator !=(Sub test1, Sub test2)
        {
            return !(test1 == test2);
        }
    }

Lg XXX


//Edit: Ich denke das es auch eine schlechte Angewohnheit ist mit == zu arbeiten(wie ich es selber auch permanent mache) eben, weil == oft irreführend sein kann.

Thema: WrapPanel scrollen via drag/drop
Am im Forum: GUI: WPF und XAML

Ich hätt mal folgendes versucht:

Scrollviewer hört auf MouseMove Events wenn zB linke Mouse Down und MousePosition > Rand dann Scroll um die Differenz und evt. setze MousePosition wieder zurück? sodass die Maus nie über den Rand raus bewegt werden kann.

Lg, XXX

Thema: RegEx live testen mit regexhero
Am im Forum: Rund um die Programmierung

Nettes Tool aber mMn. bei weitem nicht so angenehm wie On-the-fly Regex-Tester: Regex-Lab

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Sorry, wusste nicht, dass es die Methode nur unter .NET 4.0 gibt.

Entweder du kannst upgraden oder du musst dich mit dem Workarround mit CoerceValue zufrieden geben:Local values in DependencyObjects

Lg, XXX

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Hier mein Beispiel wos funktioniert:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication2
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MyViewModel();
        }
    }

    public class MySelectedValueTextBox : TextBox
    {
        public string SelectedValue { get { return (string)GetValue(SelectedValueProperty); } set { SetValue(SelectedValueProperty, value); } }

        public static readonly DependencyProperty SelectedValueProperty =
            DependencyProperty.Register("SelectedValue", typeof(string), typeof(MySelectedValueTextBox),
                                                       new PropertyMetadata(""));

        protected override void OnSelectionChanged(RoutedEventArgs e)
        {
            SetCurrentValue(SelectedValueProperty, SelectedText);
        }
    }

    public class MyViewModel : INotifyPropertyChanged
    {
        public List<Person> Items { get; set; }

        public MyViewModel()
        {
            Items = new List<Person> { new Person { Name = "Max Mustermann" }, new Person { Name = "Franz Huber" } };
            SelectedText = "bla";
        }

        private string _selectedText;
        public string SelectedText
        {
            get { return _selectedText; }
            set
            {
                _selectedText = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("SelectedText"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class Person
    {
        public string Name { get; set; }
    }
}

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication2="clr-namespace:WpfApplication2" Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBlock Text="{Binding Path=SelectedText}"/>

    <ListBox Name="lb" Grid.Row="1" ItemsSource="{Binding Path=Items}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <WpfApplication2:MySelectedValueTextBox Text="{Binding Name}"
              SelectedValue="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=DataContext.SelectedText, Mode=TwoWay}"/>
            <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=DataContext.SelectedText}"/>
          </StackPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  </Grid>
</Window>


Lg, XXX

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Ich hab jetzt ewig gesucht und probiert um eine Lösung zu dem Problem zu finden:

Das Problem ist hier beschrieben: Dependency Property Value Precedence

Das Problem ist, dass wenn du im Codebehind deine DependencyProperty setzt, überschreibst du damit automatisch das Binding und es wird daher kein set mehr aufgerufen.

Statt dem direkten zuweisen musst du daher einen anderen Weg nehmen:


        private void TextBoxSelectionChanged(object sender, RoutedEventArgs e)
        {
            SetCurrentValue(SelectedTextProperty, _textBox.SelectedText);
        }

Diese Methode setzt den Wert der Property ohne bestehnde Bindings zu überschreiben.

Lg, XXX

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Ich kenn mich gerade nicht mehr aus, was genau du erreichen willst.

Du willst das SelectedOutput von dem DependencyProperty SelectedValue gesetzt wird.
Wer oder was setzt SelectedValue?

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Aber im Getter schon? Ist das eine selbst definierte DependencyProperty? Dann musst du eventuell noch explizit Mode=TwoWay setzen.

Lg XXX

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Also beide Varianten _müssen_ funktionieren. RelativeSource sowie die mit ElementName. Es reicht eigentlich schon direkt an den DataContext der ListView zu binden.


"{Binding ElementName=lvOutput, Path=DataContext.SelectedOutput}"
oder

"{Binding RelativeSource={RelativeSource AncestoryType={x:Type ListView}}, Path=DataContext.SelectedOutput}"

wenn dem nicht so ist, dann ist hat der entsprechende DataContext diese Eigenschaft nicht oder der Pfad dort hin ist schlichtweg falsch.

Bindingfehler werden im Debugoutput ausgegeben. Ansonsten ist es mMn. auch ratsam immer vollqualifizierte Bindingpaths anzugeben, weil diese dann eine Exception zur Laufzeit werfen wenn sie nicht gefunden werden.

Beispiel:

(ViewModels:ISowiesoViewModel.SelectedItem)

Lg XXX

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Naja und jetzt? Poste doch bisschen mehr Code... Am besten die komplette Hierarchie bis zum Fenster rauf und wo welcher DataContext verwendet werden soll.

Lg XXX

Thema: WPF - Zwei verschiedene DataSources
Am im Forum: GUI: WPF und XAML

Hallo Sebastian1989101,

du musst mittels RelativeSource dir das MainWindow suchen und kannst dann auf den DataContext dessen mit Path=DataContext.... zugreifen.

Lg, XXX

Thema: [Erledigt] DataType eines DataTemplate ist korrekt, aber das Template wird nicht benutzt
Am im Forum: GUI: WPF und XAML

Evt. hat es was damit zu tun: Problems loading merged resource dictionaries in .NET 4.0

Thema: Binding Path = string der Property Name enthält
Am im Forum: GUI: WPF und XAML

Alternative würde mir nur ein MultiBinding einfallen, welches das Objekt und den wert des PropertyPath's bekommt und diesen dann auswertet.

Siehe dazu auch Evaluating PropertyPath on an object

Lg XXX

Thema: Listbox Selection erzwingen
Am im Forum: GUI: WPF und XAML

Lass das Eventschmeißen und Textzuweisen bei WPF sein. Schau dir MVVM an und verwende Databinding um Daten zwischen den Controls auszutauschen.

Lg XXX

Thema: IF Abfrage, um wiederholtes Verarbeiten/Senden der gleichen Daten zu verhindern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Indem du dir merkst, was du vorher gesendet hast. Und beim nächsten mal prüfst ob der Wert sich geändert hat.

Lg XXX

Thema: Doppeleinträge löschen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wo bekommst du die Daten her? Wenn aus einer DB, wärs sinnvoller dort mittels den geeigneten Selects(Group by) die Daten schon im Vorfeld zu filtern.

Lg XXX

Thema: [gelöst] Windows Shutdown rechtzeitig blockieren, sodass *keine* Anwendung beendet wird....wie?
Am im Forum: Rund um die Programmierung

Der Link in der Doku sieht aber dazu vielversprechend aus: SetProcessShutdownParameters Function.

Lg XXX

Thema: [gelöst] Windows Shutdown rechtzeitig blockieren, sodass *keine* Anwendung beendet wird....wie?
Am im Forum: Rund um die Programmierung

Laut diversen Artikeln die ich jetzt überflogen bin musst du nur das QueryEndSession Event abhorchen und bei einem Abbruch "false" zurück geben was du in deinem Codeausschnitt nicht machst.

Bei QueryEndSession wird, zumindest laut Doku, noch nichts geschlossen. Erst bei EndSession.

Ich nehm alles zurück. :)

Zitat
When an application returns TRUE for this message, it receives the WM_ENDSESSION message, regardless of how the other applications respond to the WM_QUERYENDSESSION message

Man müsste sich irgendwie an erste Stelle der Windows Nachrichtenschleife reinhängen. Hätt aber keine Ahnung wie.


Siehe Doku: WM_QUERYENDSESSION Message.

Lg XXX