| 

.NET C# Java Javascript Exception

1
Hallo Leute

Ich wollte auf die schnelle ein ValidateImageControl bauen. 3 DepencyPoperties genügen, dachte ich! 2 für die Urisource der Bilder und eine für die Visibility und der derr entsprechendn Bildanzeige.

Funktioniert eigentich, doch wen ich mehr als eines der Controls in einem Window anzeige, wird nur beim lezten die Visibility und die Bildauswahl angezeigt. Beim debugen läuft alles rund, dennoch ist das Ergebniss, dass die Visibility nur beim lezten UserControl angezeigt wird.

Hat jemand eine Idde wie ich das Kapseln kann, damit die Visibility und die Bildauswahl bei allen Controls angezeigt wird.

using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
namespace WpfApplication1
{
/// <summary>
/// Interaktionslogik für UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
private static readonly DependencyProperty isValidatedProperty = DependencyProperty.Register("IsValidated", typeof(bool?),
typeof(UserControl1), new UIPropertyMetadata(null, OnValidatedChanged));

private static readonly DependencyProperty invalidIconProperty = DependencyProperty.Register("InvalidatedIcon", typeof(Uri),
typeof(UserControl1), new UIPropertyMetadata(null, OnValidIconChanged));

private static readonly DependencyProperty validIconProperty = DependencyProperty.Register("ValidatedIcon", typeof(Uri),
typeof(UserControl1), new UIPropertyMetadata(null, OnInvalidIconChanged));

private static UserControl _this;
private static Image _validatedIcon;
private static Image _invalidatedIcon;


public UserControl1( )
{
InitializeComponent();

_this = this;
_this.Visibility = Visibility.Collapsed;
_validatedIcon = this.ValidatedImage;
_invalidatedIcon = this.InvalidatedImage;
}


#region Properties

public bool? IsValidated
{
get { return GetValue(isValidatedProperty) as bool?; }
set { SetValue(isValidatedProperty, value); }
}

public Uri ValidatedIcon
{
get { return GetValue(validIconProperty) as Uri; }
set { SetValue(validIconProperty, value); }
}

public Uri InvalidatedIcon
{
get { return GetValue(invalidIconProperty) as Uri; }
set { SetValue(invalidIconProperty, value); }
}

#endregion



#region Private

private static void OnValidIconChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null) _validatedIcon.Source = new BitmapImage(e.NewValue as Uri);
}

private static void OnInvalidIconChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null) _invalidatedIcon.Source = new BitmapImage(e.NewValue as Uri);
}

private static void OnValidatedChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{

if (e.NewValue as bool? != null)
{
//_this.Visibility = Visibility.Visible;

if (e.NewValue as bool? == true)
{
_validatedIcon.Visibility = Visibility.Visible;
_invalidatedIcon.Visibility = Visibility.Collapsed;
}

if (e.NewValue as bool? == false)
{
_validatedIcon.Visibility = Visibility.Collapsed;
_invalidatedIcon.Visibility = Visibility.Visible;
}

}


}
#endregion

}
}


und die Oberfläche des Controls:

<UserControl x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Image x:Name="ValidatedImage" Height="24" Width="24"/>
<Image x:Name="InvalidatedImage" Height="24" Width="24"/>
</Grid>
</UserControl>

ich habe das ganze auh bereits von der Klasse Image abgeleitet ausgearbeitet und das selbe Ergebniss erhalten.

Ich hoffe dass Ihr mir aus meiner gedanklichen Blockade helfen könnt.

Gruss Alex
29.11.2013
Maendler 214 1 7
2 Antworten
1
Das Problem kommt von den static Variablen her. Diese zeigen immer auf die letzte Instanz der Klasse.

Diese Variablen solltest Du entfernen und bei den DependencyProperty-Funktionen folgendes Pattern anwenden:

private static void OnValidIconChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
IUserControl1 userControl = dp as UserControl1;
if (userControl != null && e.NewValue != null)
{
userControl.ValidatedIcon.Source = new BitmapImage(e.NewValue as Uri);
}
}
29.11.2013
Roland Bär 338 6
0
Danke für den Typ! Noch zur allgemeinen Info: Das DepencyObject ist nicht Image sondern UserControl1. Das richtige Patern sieht somit so aus:
private static void OnValidIconChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
UserControl1 userControl = dp as UserControl1;
if (userControl != null && e.NewValue != null)
{
userControl.ValidatedImage.Source = new BitmapImage(e.NewValue as Uri)
}

}


Gruss Alex
29.11.2013
Maendler 214 1 7
Da hast Du recht. Sorry, war noch früh am Morgen und gerade kein Beispiel zur Hand... :-)
Danke für die Berichtigung
Roland Bär 29.11.2013
Habe meine Antwort angepasst.
Roland Bär 29.11.2013

Stelle deine .net-Frage jetzt!