Ich erstelle ein benutzerdefiniertes Steuerelement "CustomAutoCompleteBox" (das von AutoCompleteBox erbt) mit einer Abhängigkeitseigenschaft "CurrentItem".Abhängigkeitseigenschaft wird nicht von ViewModel festgelegt
public static readonly DependencyProperty CurrentItemProperty =
DependencyProperty.Register("CurrentItem", typeof(CityEntity), typeof(CustomAutoCompleteBox),
new FrameworkPropertyMetadata(
null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public CityEntity CurrentItem
{
get { return (CityEntity)GetValue(CurrentItemProperty); }
set { SetValue(CurrentItemProperty, value); }
}
Dieses benutzerdefinierte Steuerelement hat auch eine Eigenschaft "InternalCurrentItem".
public CityEntity InternalCurrentItem
{
get { return _internalCurrentCity; }
set
{
if (_internalCurrentCity == value) return;
_internalCurrentCity = value;
OnPropertyChanged();
CurrentItem = value;
}
}
Der Datacontext ist sich im Konstruktor definieren:
public VilleAutoCompleteBox()
{
DataContext = this;
...
}
und der Stil gesetzt Itemssource und SelectedItem wie folgt aus:
<Style TargetType="{x:Type infrastructure_controls:CustomAutoCompleteBox}" BasedOn="{StaticResource AutoCompleteBoxFormStyle}">
<Setter Property="ItemsSource" Value="{Binding InternalItems, Mode=OneWay}" />
<Setter Property="SelectedItem" Value="{Binding InternalCurrentItem, Mode=TwoWay}" />
...
</Style>
Zusammengefasst ist Itemssource binden an interne Eigenschaft "InternalItems" und SelectedItem sind an die interne Eigenschaft "InternalCurrentItem" gebunden.
Für die Verwendung es, erkläre ich diese CustomAutoCompleteBox wie folgt aus:
<infrastructure_usercontrols:CustomAutoCompleteBox Width="200" CurrentItem="{Binding DataContext.VmCurrentItem, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Mode=TwoWay}" />
Ich habe die Abhängigkeitseigenschaft „CurrentItem“ binden an die Ansichtsmodell Eigentum „VmCurrentItem“.
Alles funktioniert gut bis auf eine Sache.
Wenn ich Text in das Steuerelement einfüge, ändert sich die InternalCurrentItem-Eigenschaft ordnungsgemäß. Gleiches gilt für die CurrentItem-Eigenschaft in meinem ViewModel.
Konkret wird InternalCurrentItem korrekt geändert (Set). Diese Eigenschaft legt die CurrentItem-Abhängigkeitseigenschaft fest, und diese Abhängigkeitseigenschaft legt VmCurrentItem fest.
Das Gegenteil ist nicht wahr. Wenn ich den Wert der VmCurrentItem-Eigenschaft in dem ViewModel direkt ändere, wird die CurrentItem-Eigenschaft nicht geändert. Ich verstehe nicht warum.
Als Hinweis, sollten Sie in der Regel festgelegt kein Datacontext die Kontrolle an sich selbst, weil sie verhindert, dass die Steuerung übernimmt die Datacontext sein Elternsteuerelement oder Fenster. Sie können leicht einen Beweis für diese Regel finden, wenn Sie sich die Komplexität Ihrer CurrentItem-Bindung ansehen. Schreiben Sie einfach die "internen" Bindungen des Controls mit RelativeSource. Siehe z.B. diese Antwort: https://stackoverflow.com/a/28982771/1136211 – Clemens
Ich habe meinen Code nach Ihren Empfehlungen aktualisiert. Dies ist sauberer, behebt das Problem jedoch nicht. – StevenPF