Kann WPF Custom Control Trace-Ansicht Modell-Untereigenschaften ändert sich selbst neu zu rendern?WPF Custom Control rerdering auf Ansicht Modell-Untereigenschaften ändern
Lassen Sie uns sagen, dass ich ein Modell mit zwei Eigenschaften haben:
public class FullName : ViewModel
{
string _first;
string _last;
public string First
{
get { return _first; }
set
{
_first = value;
RaisePropertyChanged();
}
}
public string Last
{
get { return _last; }
set
{
_last = value;
RaisePropertyChanged();
}
}
}
Wo ViewModel
ist:
public abstract class ViewModel : INotifyPropertyChanged
{
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) =>
PropertyChanged?.Invoke(this, e);
public event PropertyChangedEventHandler PropertyChanged;
}
Ich möchte eine Abhängigkeitseigenschaft auf der WPF Custom Control haben (AffectsRender
, nein SubPropertiesDoNotAffectRender
), um das Modell so zu referenzieren, dass die Steuerung automatisch auf First
und Last
umwandelt:
public class Tag : Control
{
public static readonly DependencyProperty FullNameProperty =
DependencyProperty.Register("FullName", typeof(FullName), typeof(Tag),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
public FullName FullName
{
get { return (FullName)GetValue(FullNameProperty); }
set { SetValue(FullNameProperty, value); }
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
if (FullName == null)
return;
FontFamily courier = new FontFamily("Courier New");
Typeface courierTypeface = new Typeface(courier, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
FormattedText ft2 = new FormattedText(FullName.First + " " + FullName.Last,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
courierTypeface,
14.0,
Brushes.Black);
drawingContext.DrawText(ft2, new Point());
}
}
Hier ist das Snippet zu testen:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication3"
mc:Ignorable="d"
Title="MainWindow" Height="139.9" Width="249.514">
<StackPanel>
<StackPanel.DataContext>
<local:FullName>
<local:FullName.First>John</local:FullName.First>
<local:FullName.Last>Doe</local:FullName.Last>
</local:FullName>
</StackPanel.DataContext>
<local:Tag FullName="{Binding}" Height="20"/>
<TextBox Text="{Binding First, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Text="{Binding Last, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Window>
Leider funktioniert es nicht - Änderungen nicht auf die individuelle Steuerung propagieren. Kann es effizient gemacht werden? Was ist das SubPropertiesDoNotAffectRender
dann?
@nkoniishvt Eigentlich einen Blick auf 'Tag, bitte haben. OnRender', der 'FullName.First +" "+ FullName.Last' zeichnet. Was ich brauche, ist eine vollständig "vom Eigentümer gezeichnete" Diagrammkomponente (keine Vorlagen oder Vererbung beteiligt), um den Inhalt des dynamisch aktualisierbaren Diagramms des Ansichtsmodellobjekts anzuzeigen. Ich habe den Eindruck, dass die Kontrolle die Untereigenschaften von Modellen verändert, ohne dass diese explizit durch 'SubPropertiesDoNotAffectRender' unterdrückt werden, aber das funktioniert nicht. –