Laden...

Forenbeiträge von Quaneu Ingesamt 692 Beiträge

11.10.2011 - 22:26 Uhr

Hallo zusammen,

ich habe eine grundsätzliche Frage in Bezug auf Custom Controls.

Wendet man hier am Besten auch Mvvm an? Bzw. Erstellt man eine Controller.cs in der die Logic untergebracht ist und an deren Properties man sich dann bindet, oder gibt es hier besser Ansätze?

Vielen Dank schon mal für eure Meinungen
Quaneu

02.10.2011 - 20:50 Uhr

Müsste richtig gesetzt sein, hatte zum Testen im Binding der Itemsource ein Converter gesetzt und dieser springt an.

Im Output steht leider auch nichts... Und das "komische" ist, dass das Binding im HierachicalDataTemplate wohl nicht anspringt, denn anstatt Chidlren kann ich auch abcdef schreiben und im Output taucht kein Fehler bezüglich Binding auf.

01.10.2011 - 17:54 Uhr

Hallo zusammen,

ich kämpfe seid gestern mit dem HierarchicalDataTemplate, denn es will einfach nicht klappen und ich finde den Fehler nicht...

Folgendes Beispiel:


public class TestVM : Notification, ITestVM
{
   private string _name;
   private readonly ObservableCollection<ITestVM> _children;

   public TestVM(string name)
   {
      this._name = name;
      this._children = new ObservableCollection<ITestVM>();
   }
   
   public string Name
   {
	get { return _cluster.Name; }
	set
	{
		if (_name.Name != value)
		{
			_name.Name = value;
			NotifyPropertyChanged("Name");
		}
	}
    }
   
    public ObservableCollection<ITestVM> Children
    {
        get { return _children; }
    }
} 

public interface ITestVM
{
	string Name { get; set; }
	ObservableCollection<ITestVM> Children { get; }
}

In einem TreeView wollte ich nun per HierarchicalDataTemplate eine Instance von TestVM darstellen (über ITestVM).

Dies hab eich wie folgt versucht:


...
public ITestVM Test
{
	get { return _test; }
	private set
	{
		_test= value;
		NotifyPropertyChanged("Test");
	}
}
...


<TreeView ItemsSource="{Binding Test, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Foreground="Red" Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Doch leider passiert gar nichts... und ich weiß einfach nicht was ich falsch mache...

Viele Grüße
Quaneu

26.09.2011 - 22:33 Uhr

Vielen Dank für Deine schnell Antwort.

Das gefällt mir schon viel viel besser als mein Vorschlag.

Grüße
Quaneu

26.09.2011 - 22:26 Uhr

Hallo zusammen,

ich würde gern eure Meinung bezüglich der Implementierung von ReadOnly wissen.

Wenn ich z.B. folgende Klasse habe


public class Test
{
   private string _name;

   public Test(string name)
   {
      _name = name;
   }

   public string Name
   {
	get { return _name; }
	set { _name = value; }
   }
}

Jetzt würde ich gern von dieser eine ReadOnly Version herstellen. Doch ich weiß noch nicht wie man dies am "schönsten" umsetzten kann.
Mein Vorschlag wäre es eine Basisklasse zu erstellen und von dieser ableiten, wobei in der ReadOnly-Version die setter leer bleiben würden.

Doch vielleicht gibt es ja noch einen besseren Weg.

Viele Grüße und schon mal Danke
Quaneu

21.09.2011 - 09:08 Uhr

Danke nochmals für Deine Meinung.
Dies habe ich wie folgt gelöst:


<xsd:simpleType name="UUIDType">
	<xsd:restriction base="xsd:string">
		<xsd:length value="36" fixed="true"/>
		<xsd:pattern value="[A-Z0-9]{8}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{12}"/>
	</xsd:restriction>
</xsd:simpleType>

Aber Danke für den Hinweis.

20.09.2011 - 20:11 Uhr

Vielen Dank für Deine Hilfe (hab ich ganz vergessen zu sagen...)

Bin leider noch recht neu auf dem Gebiet, daher sagt mir das grad ein bisserl wenig...

Aber ich hab jetzt auch eine Lösung gefunden. Jetzt wollt ich noch Deine Meinung wissen:

Sie sieht wie folgt aus:


<xsd:element name="Root" type="RootType">
	<xsd:unique name="key">
		<xsd:selector xpath="child::*/child::*"/>
		<xsd:field xpath="@UUID"/>
	</xsd:unique>
</xsd:element>

Wobei Root das Wurzel-Element meiner XML-Datei ist, in der die verschiedenen Listen hängen.

Viele Grüße
Quaneu

20.09.2011 - 17:14 Uhr

Das klappt leider nicht... hab ich auch schon probiert. Denn wenn die GUID mit einer Zahl beginnt jammert er auch.

P.S.
Mein UUID ist ein Attribut das bei allen Elementen in den Listen existiert.

20.09.2011 - 15:14 Uhr

Wahrscheinlich schon, aber ich benutze UUIDs und diese können mit einer Zahl anfangen und dies ist bei ID verboten... (hab ich gerade probiert).

20.09.2011 - 12:35 Uhr

verwendetes Datenbanksystem: XML

Hallo allerseits,

ich bin gerade dabei ein Schema für meine XML-Dateien zu generieren. Dabei bin ich auf folgendes "Problem" gestoßen:

Ich habe ein Wurzelelement in dem mehrere Listen, in denen jeweils verschiedene Datentypen enthalten sind. Jedes Element in den Listen besitzt eine UUID die eindeutig sein soll. Mein Problem ist es, diese Eindeutigkeit zu bewerkstelligen, d.h. diese UUID soll im ganzen XML-Dokument eindeutig sein und nicht nur in einer Liste (dies erreiche ich ja über xsd:key oder xsd:unique).

Ich hoffe mir kann wer bei diesem Problem weiterhelfen...

Schöne Grüße
Quaneu

30.08.2011 - 15:21 Uhr

Hallo,

Wie ich z.B. im "Key_Down"-Event der Textbox abfragen kann, ob es eine Zahl ist oder nicht, weiß ich, aber wie kann man noch den Doppelpunkt in der Mitte abfragen bzw. dann auch zulassen?

Du könntest einen Regulärer Ausdruck verwenden um die Eingabe zu validieren.

Kann man es vielleicht auch so hinbekommen, dass man den Doppelpunkt in der Mitte schon vorab anzeigen lassen kann, so dass der Benutzer nur noch die zwei Zahlen für die Stunden und die Minuten eingeben muss?

Du könntest Dir ein UserControl basteln, das aus zwei TextBoxen und einem TextBlock besteht, der Dir den : anzeigt.

Grüße
Quaneu

30.08.2011 - 11:33 Uhr

Ich auch 😃 , aber leider wusste ich nicht wie, da ich mich ja nicht an den CommandParameter binden kann und ich so nicht weiß, wen ich löschen soll.
Aber bin immer gern bereit neues zu lernen 😉

30.08.2011 - 10:28 Uhr

Ich habe in der Klasse noch folgendes Property:


public IFoodVM SelectedItem
{
	get { return _selectedItem; }
	set
	{
		_selectedItem = value;
		if (SelectedItemChanged != null)
		{
			SelectedItemChanged(this, new PropertyChangedEventArgs("SelectedItem"));
		}
	}
}

An dieses bindet sich das SelectedItem des DataGrids.


<DataGrid  ItemsSource="{Binding Path=.,Converter={StaticResource TEST_CONVERTER}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" SelectedItem="{Binding Path=SelectedItem}">

Hab es wohl leider mit rausgelöscht... wollte nämlich nur die betreffenden Codezeilen posten.
Der Commandparameter wird hier nicht benötigt und würde auch "später" raus fliegen. Doch ich verstehe nicht, wieso er immer die Exception wirft...

30.08.2011 - 09:07 Uhr

Hallo zusammen,

ich wollte mir gerade eine eigene "ObservableCollection" namens FoodCollection bauen, da ich nicht immer will, dass meine GUI sich aktualisiert. Diese funktioniert soweit auch problemlos, d.h. das z.B. ein Datagrid beim hinzufügen und löschen von Items in meiner FoodCollection die Zeilen aktualisiert.

Doch bekomme ich immer folgende Exception

Fehlermeldung:
System.ArgumentOutOfRangeException was unhandled
Message=Specified argument was out of the range of valid values.
Parameter name: index
Source=PresentationFramework
ParamName=index
StackTrace:
at System.Windows.Controls.ItemCollection.GetItemAt(Int32 index)
....

wenn ich in in FoodCollection ein Item lösche und danach ein neues wieder hinzufügen will...

FoodCollection sieht wie folgt aus:


public class FoodCollection : List<IFoodVM>, ICollectionBase<IFoodVM>, INotifyCollectionChanged
{
	public event NotifyCollectionChangedEventHandler CollectionChanged;

	public FoodCollection()
	{
		AddCommand = new ActionCommand(AddExecute, CanAddExecute);
		RemoveCommand = new ActionCommand(RemoveExecute, CanRemoveExecute);
	}
	#region Commands
	public ICommand AddCommand { get; private set; }
	public ICommand RemoveCommand { get; private set; }

	private void AddExecute(object parameter)
	{
		IFoodVM newFood = FoodVM.Create();
		AddWithNotification(newFood);
	}

	private bool CanAddExecute(object parameter)
	{
		return true;
	}

	private void RemoveExecute(object parameter)
	{
		IFoodVM selectedItem = SelectedItem;
		RemoveWithNotification(selectedItem);
	}

	private bool CanRemoveExecute(object parameter)
	{
		return true;
	}
	#endregion


	public void AddWithNotification(IFoodVM food)
	{
		Add(food);

		if (CollectionChanged != null)
		{
			CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, food));
		}
 	}

	public void AddWithOutNotification(IFoodVM food)
	{
		Add(food);
	}

	public void RemoveWithNotification(IFoodVM food)
	{
		Remove(food);
		if (CollectionChanged != null)
		{
			CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, food));
		}
	}
}

Diese "ObservableCollection" wird durch folgendes DataTemplate dargestellt:


<DataTemplate DataType="{x:Type collections:FoodCollection}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackPanel Margin="0,-28,0,2" HorizontalAlignment="Right" Orientation="Horizontal" Height="24">
            <Button Command="{Binding AddCommand}" Content="+" Width="20" Margin="0,0,2,0" />
            <Button Command="{Binding RemoveCommand}" Content="-" Width="20" Margin="2,0,0,0" />
        </StackPanel>
        <DataGrid Grid.Row="1" ItemsSource="{Binding Path=.,Converter={StaticResource TEST_CONVERTER}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
            <DataGrid.Columns>
                   ....
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</DataTemplate>

Den TEST_CONVERTER habe ich mal eingebaut um zu sehen ob die ItemsSource aktualisiert wird wenn ich ein Item aus der FoodCollection entferne. Dies ist jedoch leider nicht der Fall und daher vermute ich den Fehler hier. Doch leider weiß ich nicht was ich falsch gemacht habe, da ich doch INotifyCollectionChanged eingebunden habe, das für die Benachrichtigung verantwortlich ist...

EDIT:
Dies scheint nicht der Fehler zu sein, da die ObservableCollection selbst auch nicht die ItemsSource aktualisiert (also ich auch bei ihr nicht in den Converter "komme").

Viele Grüße
Quaneu

24.08.2011 - 11:49 Uhr

Werde ich machen und in Zukunft weiß ich zu 100% was BL bedeuted 😉

Also ich glaube nicht, dass sie es wirklich hosten. "Mein" Programm besitzt eine Schnittstelle, die sie ansprechen. Dort gibt es eine Methode ShowGUI und diese legt die Form an und zeigt sie an. Mehr weiß ich leider nicht. Hab aber schon eine Anfrage abgeschickt.

Da die Anwendung verschiedene Anwender benutzten zeigt sie je nach dem welcher Anwender es ist mal dies oder mal das an. Dieser Code macht das Ding hauptsächlich so groß und dann wer was machen darf usw usw.

24.08.2011 - 11:11 Uhr

Die Form wird in Matlab eingebunden bzw. von dort aus wird die Schnittstelle des Programms angesprochen, welche dann die Form anzeigen löst.

Die Form ist da um Daten aus einer Datenbank anzuzeigen und wird auch dafür verwendet um Daten anzulegen usw..

Leider kann ich mit deiner Abkürzung nichts anfangen, was meinst du mit BL?

24.08.2011 - 10:37 Uhr

Ich versuch es mal.

Also es eine Form, die aus einigen Form-Controls aufgebaut ist (es wird nichts "selber" gezeichnet) unter anderem auch GroupBoxes. Jetzt kommt es bei einem Anwender recht häufig vor, dass (wie es bis jetzt aussieht) die GroupBoxes durch rote Rechteck ersetzt werden.
Der Anwender hat die Form, bei der dies passiert, seinerseits in seiner Anwendung eingebunden, doch leider weiß ich nicht wie.

In der Fehlermeldung steht unter anderem noch:> Fehlermeldung:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

24.08.2011 - 10:21 Uhr

Würd ich gern, aber leider weiß ich nicht wo ich anfangen soll...
Hab den Code nur übernommen und die Form ist riesig (> 30000 Zeilen), daher wird euch das nicht helfen 😃

Hm... klingt aber gar nicht schlecht... denn sie meinten auch, dass es bei Ihnen immer langsamer wird je öfter sie es starten.

Könntest Du mir das vielleicht bisschen näher erläutern? Dazu sein angemerkt, dass ich nur die "Form-Controls" verwende, also nichts "selber" zeichnen.

24.08.2011 - 09:57 Uhr

Da liegt das Problem. Das Control ist von "mir".

Bei mir ist dieser Fehler aber noch nie aufgetreten und ich habe nicht einmal die OnPaint überschrieben, aber bei anderen scheint dieser Fehler recht häufig zu kommen, daher hatte ich die Hoffnung, dass die Evnets greifen und ich im Log noch sehen kann, warum und wo dieser Fehler passiert ist.

24.08.2011 - 09:38 Uhr

Also ich habe jetzt nochmals nachgeschaut und ich habe folgende Events, die meine Unhandeld Exceptions abfangen sollten.



Application.ThreadException += new ThreadExceptionEventHandler(handler.Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(unhandledExceptionHandler.CurrentDomain_UnhandledException);

Doch wird die Exception die dafür verantwortlich ist, dass die roten Rechtecke gezecihnet werden, wird von dieses Events nicht behandelt, da eine "Unhandled exception has occured..." auftritt.

EDIT:
Es scheint so, als ob es nur das UI-Element GroupBoxe betrifft, da all diese durch das rote Rechteck "ersetzt" werden.

Viele Grüße
Quaneu

23.08.2011 - 22:00 Uhr

Genau so sieht es aus, bzw. noch schlimmer, denn wenn dieser Fehler kommt, dann betrifft dies ca. 10 Controls auf einmal...

Und ich wüsste nicht warum dies nur bei anderen auftritt...

Nochmals vielen Dank für Deine (erneuten 😃 ) Bemühungen.

23.08.2011 - 21:53 Uhr

Vielen Dank für eure Hilfe. Werde ich morgen gleich mal probieren.

Wobei ich glaub, dass ich schon ein "derartiges" Exception-Handling habe, doch wurde sie durch dieses Event nicht "gefangen" (bin mir aber nicht sicher, werde es morgen nochmals prüfen).

Wenn diese Methoden von mir nicht überschrieben wurden, können diese dann Exceptions werfen?

23.08.2011 - 21:44 Uhr

Der Fehler tritt zur Runtime auf. Aber leider noch nie bei mir...

23.08.2011 - 21:36 Uhr

Hallo,

ich bin grad auf der Suche nach einem Fehler, den ich leider bei mir nicht reproduzieren kann..

Folgendes Problem:

Hin und wieder werden unterschiedlichste Controls nicht "gezeichnet", sondern einfach nur ein rotes Rechteck mit zwei Diagonalen.
Und jetzt frage ich mich, wann dies eintritt. Doch leider hab ich nichts diesbezüglich gefunden...

Viele Grüße
Quaneu

22.08.2011 - 14:15 Uhr

Hab nun in meiner Mittagspause eine andere Möglichkeit gefunden 😃

Hier meine Lösung:

Mein ContenControl in der View sieht wie folgt aus:


<ContentControl Content="{Binding Items, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Tag="{Binding SelectedItem, Mode=OneWayToSource}" />

Und hier z.B. ein DataTemplate, das eine BillCollection darstellt:


<DataTemplate DataType="{x:Type collections:BillCollection}">
	<DataGrid ItemsSource="{Binding}"
			SelectedItem="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Article name" Binding="{Binding ArticleName}" />
            <DataGridTextColumn Header="Date" Binding="{Binding Date}" />
            <DataGridTextColumn Header="Amount" Binding="{Binding Amount}" />
            <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
            <DataGridTextColumn Header="Unit" Binding="{Binding Unit}" />
            <DataGridTextColumn Header="Receiver" Binding="{Binding Receiver}" />
        </DataGrid.Columns>
    </DataGrid>
</DataTemplate>

Bin aber über jede Kritik bzw. Verbesserungsvorschläge dankbar 😃

Viele Grüße
Quaneu

22.08.2011 - 09:12 Uhr

Es ist wohl eine never ending story...

Das anzeigen habe ich jetzt sowohl über ContentTemplateSelector als auch nur über DataTemplates gelöst. Doch nun bin ich auf ein neues Problem gestoßen...

Das SelectetdItem im DataGrid soll an das SelectetdItem-Property in meiner ViewModel gebunden werden.
Ich habe zwar eine Lösung gefunden, doch würde ich gern wissen, ob es nicht eine "schönere" gibt.

Meine Lösung sieht wie folgt aus:

Ich habe in meinem ContentControl nun eine MultiBinding, das sich auf die Items und auf die ganze ViewModel bindet. Dadurch kann ich mich im DataTemplate des Datagrids auf das SeledctedItem binden. Doch irgendwie gefällt mir das nicht wirklich und daher würde ich gern wissen, ob dies der richtige Weg ist?

Viele Grüße
Quaneu

20.08.2011 - 21:34 Uhr

Jetzt hab ich´s... sorry stand wohl auf dem Schlauch...

Hatte im DataTemplate stehen:


<DataGrid ItemsSource="{Binding Items}">

Das hat nicht funktionert... (eigentlich klar) daher hatte ich es wieder raus genommen. Mit


<DataGrid ItemsSource="{Binding}">

funktioniert wunderbar.

Vielen Dank nochmals.

20.08.2011 - 15:59 Uhr

Jetzt hätte ich leider doch noch eine Frage...

Es klappt soweit fast alles, doch leider weiß ich nicht, wie ich die Items in mein DataGrid bekomme.

Ich habe ein ContentControl:


<ContentControl Content="{Binding Items}" ContentTemplateSelector="{StaticResource _dataGridTemplateSelector}" />                      

Und z.B. folgendes DataTemplate:


<DataTemplate x:Key="_dataGridBill">
    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Article name" Binding="{Binding ArticleName}" />
            <DataGridTextColumn Header="Date" Binding="{Binding Date}" />
            <DataGridTextColumn Header="Amount" Binding="{Binding Amount}" />
            <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
            <DataGridTextColumn Header="Unit" Binding="{Binding Unit}" />
            <DataGridTextColumn Header="Receiver" Binding="{Binding Receiver}" />
        </DataGrid.Columns>
    </DataGrid>
</DataTemplate>

Jetzt sehe ich zwar immer die richtigen Spalten, doch leider bekomme ich nicht die Items in mein DataGrid...

Viele Grüße
Quaneu

20.08.2011 - 12:14 Uhr

Vielen Dank für Deine Hilfe.

Ich wollte eigentlich AutoGenerateColumns nur indirekt benutzten. Meine Idee wäre es eigentlich, mich dann an das Event AutoGeneratingColumn zu hängen und hier nur die Spalten anzuzeigen, die ich auch anzeigen will.

Aber Dein Ansatz würde mir bei weitem besser gefallen, daher werde ich mal versuchen Deinen Vorschlag umzusetzen.

Und nochmals Danke.

20.08.2011 - 11:26 Uhr

Hallo,

ich hätte eine weitere Frage in Bezug auf das DataGrid (diese resultiert aus folgendem Beitrag)

Ich will ein einem DataGrid gerne verschieden Daten anzeigen. Je nach dem was der User auswählt.
Daher hat mein ViewModel ein Property


public ObservableCollection<IBaseVM> Items {get; private set;}

an das sich die ItemSource des DataGrids bindet.

Doch was ist nun der "schönste" Weg, um die Spalten dynamisch zu erzeugen?

@gfoidl:

Ein DataGrid eine reine View-Sache. Somit verstehe ich die Frage "in MVVM" nicht unbedingt. Dem ViewModel ist es egal ob die Daten in einem DataGrid od. sonst was angezeigt werden - es sollte das gar nicht wissen (dürfen) und auch unabhängig von der tatsächlichen Anzeige umgesetzt werden.

Da hast Du natürlich vollkommen recht, daher würde ich gern wissen, wie man dies am schönsten in der View realisiert.

Grüße
Quaneu

20.08.2011 - 11:16 Uhr

Als erstes vielen Dank für Deine Antwort.

Wie meinst du das? So: Der Typ der ObservableCollection T entspricht dem Basis-Interface meiner ViewModels.

Genau so meinte ich es.

Also mein Interface für die ViewModel der Core Klasse Bill sieht z.B. so aus:


public interface IBillVM : IBaseVM
{
   DateTime Date { get; set; }
   Unit Unit { get; set; }
   bool IsValidated { get; }
   string Error { get; }
   string Quantity { get; set; }
   string Amount { get; set; }
   string ArticleName { get; set; }
   string Receiver { get; set; }
   string this[string propertyName] { get; }
}

In der ViewModel, in der unter anderem eben Bill angezeigt werden soll gibt es ein Property an das sich die ItemSource des Datagrids bindet.


public ObservableCollection<IBaseVM> Items {get; private set;}

Und das funktioniert leider nicht... vielleicht liegt es daran, dass das Interface IBaseVM und nicht IBillVM in der ObservableCollection "steckt".

Wegen dem anderen Frage werde ich einen neuen Beitrag eröffnen und in diesem auf Deine Antwort eingehen (Der beste Ansatz für ein dynamisches DataGrid )

Viele Grüße
Quaneu

19.08.2011 - 20:49 Uhr

Hallo,

ich hätte mal eine kurze Frage zum Datagrid:

Ich binde die ItemSource an eine ObservableCollection. In dieser befinden sich Interfaces meiner ViewModels. Nun dachte ich, dass ich über AutoGenerateColumns die Spalten automatisch erzeugt werden. Doch leider passiert gar nichts... bzw. die Zeilen werden angezeigt, aber jedoch ohne Spalten und Inhalt.

Ich weiß, dass nicht alle Typen unterstütze werden, doch dachte ich, dass diese einfach übergangen werden... es wird jedoch nicht mal das Event AutoGeneratingColumn ausgelöst.

Weiß jemand woran das liegen kann?

Und gleich noch eine Frage, kennt jemand einen guten Artikel für dynamische Datagrids in MVVM?

Viele Grüße
Quaneu

18.08.2011 - 13:45 Uhr

Danke für den Hinweis.

Mit dem Beispiel auf dieser Seite:


<Style x:Key="textStyleTextBox" TargetType="TextBox">
  <Setter Property="Foreground" Value="#333333" />
  <Setter Property="MaxLength" Value="40" />
  <Setter Property="Width" Value="392" />
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={RelativeSource Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

habe ich versucht meine Validation.Errors anzuzeigen, doch leider kam es mit diesem Beispiel zu dem besagten Output-Ausgaben, die ich vermeiden wollte.

Viele Grüße
Quaneu

18.08.2011 - 11:13 Uhr

Hab nun eine Lösung beim WPF Guru gefunden 😉

Binding to (Validation.Errors)[0] without Creating Debug Spew

Klappt wunderbar.

Grüße
Quaneu

17.08.2011 - 13:18 Uhr

Hallo,

ich habe eine TextBox die z.B. an ArticleName gebunden ist. Dieses Property befindet sich in meinem Viewmodel, dass das Interface IDataErrorInfo implementiert.

Falls nun ungültige Daten eingegebn werden, will ich in meiner GUI dem User einen "Hinweis" geben. Dies habe ich wie folgt versucht:


<DataTemplate DataType="{x:Type my:BillVM}">
   <StackPanel>
      <TextBox x:Name="_articleName" Text="{Binding ArticleName, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
       <TextBlock>
          <TextBlock.Style>
	    <Style TargetType="{x:Type TextBlock}">
	       <Style.Triggers>
	          <DataTrigger Binding="{Binding ElementName=_articleName, Path=(Validation.HasError), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}}" Value="True">
		     <Setter Property="Text" Value="{Binding ElementName=_articleName, Path=(Validation.Errors)[0].ErrorContent, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
		  </DataTrigger>
	       </Style.Triggers>
            </Style>
         </TextBlock.Style>
      </TextBlock>
   </StackPanel>
</DataTemplate>

Dies klappt auch ganz gut, doch eine Sache stört mich schon die ganze Zeit... Im Output taucht immer wieder folgende "Meldung" auf:> Fehlermeldung:

System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'ValidationError') from '(Validation.Errors)'...

Und eich weiß einfach nicht warum... ich habe auch schon in Converter zuwischengeschaltet um zu sehen ob der Trigger richtig funktioniert. Dieser schaltet wirklich nur auf True, wenn ein Fehler vorliegt... daher meine meine Frage:

Wie kann es sein, dass er in einem Nicht-Fehler-Fall auf (Validation.Errors) zugreifen will?

Viele Grüße und schon mal Danke
Quaneu

12.08.2011 - 22:19 Uhr

Und eine andere Möglichkeit Properties dynamisch hinzufügen, so dass man sie mit GetType().GetProperties() gibt es nicht?

Dann werde ich deinen Vorschlag in die Tat umsetzten.

Nochmals vielen Dank.

12.08.2011 - 21:45 Uhr

Ich habe schon zugriff auf das Programm, wollte es aber eigentlich nicht mehr ändern.

Aber wenn es keine andere Möglichkeit, muss ich wohl doch Änderungen an diesem vornehmen.

Vielen Dank schon mal für Deine Hilfe.

Grüße
Quaneu

12.08.2011 - 21:16 Uhr

Also ich habe ein Programm, dem ich eine Instanz einer Klasse übergebe und das Programm analysiert die Properties dieser Klasse über Reflection (GetProperties() usw.) und erzeugt mir dann eine XML-Datei.

Nun würde ich dieses Programm gerne erweitern, indem ich z.B. Excel Dateien lese und mir dann dynamisch eine Klasse baue, die ich dann meinem Programm übergeben kann.

12.08.2011 - 21:07 Uhr

Wie kann ich mich nur bei Dir bedanken... VIELEN VIELEN DANK.
Ich verneige mich vor Dir 🙂

Grüße
Quaneu

12.08.2011 - 20:27 Uhr

Hallo,

ich hätte folgende Frage:

Ich würde gern mit dynamic bzw. ExpandoObject dynamisch ein "Objekt" erzeugen.
Eigentlich würde ich nur gern dynamisch Properties erzeugen. Um sie später bei Bedarf über Reflection "auszulesen".

Beispiel:


dynamic person = new ExpandoObject();
// es sollen Properties hinzugefügt werden und danach sollen diese wie folgt //ausgelsen werden
PropertyInfo[] infos = person.GetType().GetProperties();

Wenn ich dies jedoch versuche, bekomme ich immer keine Properties. Daher meine Frage, ist dieser Weg möglich, bzw. gibt es überhaupt einen Weg, dies zu realisieren?

Viele Grüße
Quaneu

12.08.2011 - 20:17 Uhr

Hm... also mein "Wunsch" ist es, in 3 Controls jeweils einen gewissen Auschnitt eines Canvas darzustellen.
Z.B.:
dies soll mein "großes" Canvas darstellen:

A B C D
E F G H
I J K L

Dann will ich in 3 Controls z.B. folgendes anzeigen:

  1. Control
    A B C D

  2. Control
    I J K L

  3. Control
    B
    F
    J

Wobei diese Ausschnitte aus ein und dem selben Canvas stammen sollen.

Da hast Du recht =) bin nämlich gerade noch an der Planung. Nicht das ich anfange zu programmieren und dann dann feststellen muss, dass es so gar nicht möglich ist.

Viele Grüße
Quaneu

12.08.2011 - 17:16 Uhr

Vielen Dank für Deinen Hinweis, so weit habe ich noch gar nicht gedacht...
Allein aus diesem Grund würde diese Umsetzung leider schon scheitern.

Ich steh grad bisserl auf dem Schlauch. Wie meinst du dies (mit dem Befüllen wie DataTemplates)?

Grüße
Quaneu

12.08.2011 - 17:05 Uhr

Da hast Du natürlich vollkommen recht, ich würde alle Elemente im Canvas und das Canvas selbst 3x erzeugen müssen, daher gefällt mir dieser Ansatz nicht.

Dein Vorschlag klingt sehr interessant. Doch hätte ich dazu eine Frage.

Wie verhält es sich dabei mit dem zoomen?
Bei einem Canvas gibt es keine Probleme, da es ja "Vektoren" sind. Doch bei einem VisualBrush geht mir doch dies verloren, oder?

Grüße
Quaneu

12.08.2011 - 15:28 Uhr

Könnte man dann sicher daraus machen, ja.

Diese 3 "Bereiche" sollen im allgemeinen Fall erstmla vollkommen unabhängig voneinander sein.

12.08.2011 - 15:22 Uhr

Mein Problem ist, dass das Canvas sehr groß ist, d.h. man muss immer scrollen, um gewisse Bereiche im Canvas zu sehen.
Daher wollte ich das Canvas einmal zeichnen und dann in 3 Bereiche unabhängig voneinander verschiedene Bereiche in diesem Canvas betrachten.

12.08.2011 - 15:12 Uhr

Hallo,

ich hätte eine Frage bezüglich folgender Umsetzung.

Ich habe ein "großes" Canvas, dass ich auf drei Controls aufteilen will. D.h. ich will z.B. in Control A die linke obere Ecke haben, in Control B den linken Rand und in Control C die Mitte des Canvas. Wie beziehungsweise ist dies überhaupt mit einem Canvas möglich?

Natürlich würde es mit 3 "gleichen Canvas gehen und über Clip die jeweiligen Auschnitte anzeigen lassen. Doch leider muss es mit einem klappen...

Viele Grüße
Quaneu

29.07.2011 - 19:46 Uhr

Das muss ich wohl verdrängt haben... ist ist auch vollkommen klar...

Gute Frage... jede Art von Aufzählung, jedoch nicht so Dinge wie string... (weiß leider grad nicht wie ich das besser beschreiben könnte...)

Grüße
Quaneu

29.07.2011 - 19:27 Uhr

Kleiner Nachtrag...

IEnumerable eignet sich nicht, um eine "Liste" zu identifizieren... denn ich habe gerade gesehen, dass string auch dieses Interface implementiert...

29.07.2011 - 10:46 Uhr

Vielen vielen Dank für eure Hilfe.

Grüße
Quaneu

29.07.2011 - 10:14 Uhr

Eigentlich nur, ob ein Property eine Auflistung ist, d.h. ob es IEnumerable implementiet, dazu habe ich schon die Methode IsAssignableFrom(...) benutzt, doch wenn ich hier IEnumerable verwenden will, will er immer noch ein Parametern...

Daher IEnumerable und ohne konkreten generischen Parametern.

Viele Grüße
Quaneu