| 

.NET C# Java Javascript Exception

5
Hallo, seit längerem grüble ich um eine Möglichkeit, aus einer DatenClasse das Attribut „Description“ an ein ToolTip einer abgeleiteten TextBox zu binden. Mit einem Converter funktioniert das Ganze bereits. Aber es ist lästig im XAML immer wieder den Converter angeben zu müssen. Darum dachte ich mir, dies der Userdefinierten TextBox machen zu lassen, falls eine Bindung besteht.
Meinen Testcode Poste ich lieber nicht, der sieht mittlerweile Furchtbar aus. Gibt es eine vernünftige Lösung bzw. wäre ich auch schon froh wenn ich einen Tipp bekomme, wie und wo ich ansetzten soll.
Danke

Datenklasse:
public class DataItem : INotifyPropertyChanged {

string p_FirmenName = string.Empty;
[ReadOnly(false), Category("Kunde"), DisplayName("Firmenname"), Description("Firmen-Wortlaut")]
public string FirmenName {
get { return p_FirmenName; }
set {
if(value != p_FirmenName) {
p_FirmenName = value;
OnPropertyChanged("FirmenName");
}
}
}

}

Usercontroll, abgeleitet aus TextBox:
public partial class MyTextBox :TextBox {
//-- Welches Ereignis enthält bereits die gebundenen Daten??
void MyTextBox_Loaded(object sender, RoutedEventArgs e) {
ToolTip = ???? Description von FirmenName ????
}
}

XAML:
<XX:MyTextBox Text="{Binding Path=FirmenName}" Style="{StaticResource WinTextMittel}"/>
News:
18.03.2014
MStrasser 342 1 8
1 Antwort
3
Auf die Schnelle ein Vorschlag:

public class CustomTextBox : TextBox
{
public static readonly DependencyProperty DataItemProperty = DependencyProperty.Register(
"DataItem",
typeof(DataItem),
typeof(CustomTextBox),
new FrameworkPropertyMetadata(default(DataItem), PropertyChangedCallback));

private static void PropertyChangedCallback(
DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs e)
{
var inner = (CustomTextBox)dependencyObject;
var dataItem = (DataItem)e.NewValue;

inner.ToolTip = GetDescription(dataItem);
}

public DataItem DataItem
{
get { return (DataItem)GetValue(DataItemProperty); }
set { SetValue(DataItemProperty, value); }
}

private static string GetDescription(DataItem item)
{
var attributes = item.GetType()
.GetProperty("FirmenName")
.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attributes.Length > 0)
{
var attribute = (DescriptionAttribute)attributes[0];

return attribute.Description;
}

return string.Empty;
}
}


<Controls:CustomTextBox 
Text="{Binding MyDataItem.FirmenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DataItem="{Binding MyDataItem, Mode=TwoWay}"
Width="200" Background="AliceBlue"/>


public class MainWindowViewModel : INotifyPropertyChanged
{
private DataItem _myDataItem;

/// <summary>
/// Initialisiert eine neue Instanz der <see cref="T:System.Object"/>-Klasse.
/// </summary>
public MainWindowViewModel()
{
MyDataItem = new DataItem { FirmenName = "Hans Wurst" };
}

public DataItem MyDataItem
{
get { return _myDataItem; }
set
{
if (Equals(value, _myDataItem))
return;
_myDataItem = value;
OnPropertyChanged("MyDataItem");
}
}

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}


Du bindest das Item per DependencyProperty an das "neue" Control. Dann per Reflection die Eigenschaft ermitteln und hier das Attribute bzw. des Wert für "Description" ermitteln.
18.03.2014
lbm1305 849 1 8
lbm1305 849 1 8
Hallo ibm1305!
Recht herzlichen Dank, funktioniert soweit, bis auf eine Kleinigkeit:
Mein DataItem hat natürlich viel mehr Felder und nicht nur das Feld „Firmenstamm“.
Wie bekomme ich nun auch den Namen des Feldes heraus, das gerade gebunden wurde.
Die Text-Bindung kennt ja die Eigenschaft: Text="{Binding MyDataItem.FirmenName, …
Wie kann ich nun den Namen herausfinden: .GetProperty("FirmenName") = .GetProperty("??????")?
MStrasser 19.03.2014

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH