SetBinding (Code Behind) funktioniert nicht, TextBlock.Text wird dabei gelöscht

AnnaBauer21

Grünschnabel
Hallo ihr Lieben,

ich habe ein kleines Testprojekt geschrieben um mein Problem einfach zu veranschaulichen.

Folgender Ablauf:

  1. Ich habe im XAML einen TextBlock mit einem Binding zu einer RelativSource.
  2. Im CodeBehind werden dann die Inlines des TextBlocks mit Highlighting Informationen erweitet
  3. Durch DataGrid mit VirtualizingStackPanel.VirtualizationMode="Recycling" ist im Event DataGrid.OnLoadingRow aber auch im Event DataGridRow.Loaded das Ergebnis von GetBindingExpression(TextBlock.TextProperty) null
  4. Nun habe ich versucht, das Binding neu zu setzen
  5. Doch das führt dazu, dass der Text im TextBlock mit dem Default-Wert ("") ersetzt wird, statt anhand dem Binding den richtigen Text heranzuziehen.
Ich hoffe ihr könnt mir helfen, wie ich es schaffen kann, dass der Text nach dem Setzen des Bindings vorhanden ist.

XAML
XML:
<StackPanel Tag="{Binding Path=MissionName, Converter={StaticResource DebugConverter}}">
    <TextBlock
        Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=StackPanel}" />
</StackPanel>


Code Behind
C#:
// Daten für Binding merken
var exp = txtBlock.GetBindingExpression(TextBlock.TextProperty);
txtBlock.Tag = new Tuple<RelativeSource, PropertyPath>(exp.ParentBinding.RelativeSource, exp.ParentBinding.Path)


var inlines = new List<Inline>();
inlines.Add(new Run(text.Substring(0, 1)));
inlines.Add(new Run(text.Substring(1, 2))
        {
            Background = filterData.SelectionColor,
            Foreground = filterData.ForegroundColor
        });
inlines.Add(new Run(text.Substring(3, 1)));

txtBlock.Inlines.Clear();
txtBlock.Inlines.AddRange(inlines);


Im Event
C#:
var tagData = (Tuple<RelativeSource, PropertyPath>) txtBlock.Tag;

var binding = new Binding { RelativeSource = tagData.Item1, Path = tagData.Item2};
txtBlock.SetBinding(TextBlock.TextProperty, binding);    // <- txtBlock.Text ist jetzt ""


// Dieser Aufruf sagt jetzt, IsDirty="true" & Status="Unattached"
var exp = txtBlock.GetBindingExpression(TextBlock.TextProperty);


Ich hoffe ihr habt eine Idee.

Ich weiß, es entspricht nicht MVVM, aber aktuell versuche ich das so um Laufen zu bringen, muss ja irgendwie gehen

Vielen Dank euch allen

Lieben Gruß
 
Zuletzt bearbeitet:
du könntest versuchen das Update des Bindings zu erzwingen
C#:
txtBlock.GetBindingExpression(TextBlock.TextProperty)?.UpdateTarget();

ich habe auch mal KI gefragt und die schlägt unteranderem ein AttachedProperty vor was auf den ersten Blick auch nicht schlecht ausschaut:

C#
C#:
public static class TextBlockExtensions
{
    public static readonly DependencyProperty HighlightProperty =
        DependencyProperty.RegisterAttached("Highlight", typeof(HighlightInfo), typeof(TextBlockExtensions),
            new PropertyMetadata(null, OnHighlightChanged));

    public static void SetHighlight(TextBlock element, HighlightInfo value)
    {
        element.SetValue(HighlightProperty, value);
    }

    public static HighlightInfo GetHighlight(TextBlock element)
    {
        return (HighlightInfo)element.GetValue(HighlightProperty);
    }

    private static void OnHighlightChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is TextBlock textBlock)
        {
            var highlight = e.NewValue as HighlightInfo;
            if (highlight != null)
            {
                // Hier die Logik zum Setzen der Inlines implementieren
            }
        }
    }
}

public class HighlightInfo
{
    public int StartIndex { get; set; }
    public int Length { get; set; }
    public Brush BackgroundColor { get; set; }
    public Brush ForegroundColor { get; set; }
}

XAML:
XML:
<TextBlock
    Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=StackPanel}}"
    local:TextBlockExtensions.Highlight="{Binding HighlightInfo}" />
 
Hallo Spyke,

danke für deine Schnell Antwort.

Leider habe ich im Hauptprojekt keine Möglichkeit dem TextBlock ein AttachedProperty hinzuzufügen.
Das wären erstens unzählige Stellen und zweitens erzeugt z.B. ein ItemsControl oder ein DataGrid mit AutoGenerateColumns=true TextBlöcke, wo ich im XAML nichts habe um das AttachedProperty hinzuzufügen.

Das erzwingen durch UpdateTarget geht leider auch nicht.
 
Zurück