Verbindlich DependencyProperty von benutzerdefinierten Steuerelement nicht aktualisieren bei änderung
Ich habe Schwierigkeiten mit databinding auf meine custom user control (s). Erstellt habe ich ein Beispiel-Projekt zu markieren mein problem. Ich bin komplett neu in WPF und im wesentlichen MVVM als gut, so mit mir tragen...
Habe ich eine einfache Ansicht, die verwendet databinding zwei Möglichkeiten. Das databinding auf die Einbau-control-funktioniert Prima. Mein benutzerdefiniertes Steuerelement nicht... ich habe einen breakpoint in die PropertyChangedCallback
meiner Kontrolle. Es wird treffen sich mal auf Start, danach aber nie wieder. Mittlerweile ist das label habe ich an das gleiche Wert ist glücklich, herunter zu zählen.
Was bin ich? Mein Beispiel-Projekt folgt auf:
Hauptfenster:
<Window x:Class="WpfMVVMApp.MainWindow"
xmlns:local="clr-namespace:WpfMVVMApp"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.DataContext>
<local:CountdownViewModel />
</Grid.DataContext>
<Label Name="custName" Content="{Binding Path=Countdown.ChargeTimeRemaining_Mins}" Height="45" VerticalAlignment="Top"></Label>
<local:UserControl1 MinutesRemaining="{Binding Path=Countdown.ChargeTimeRemaining_Mins}" Height="45"></local:UserControl1>
</Grid>
</Window>
Hier ist mein Modell:
namespace WpfMVVMApp
{
public class CountdownModel : INotifyPropertyChanged
{
private int chargeTimeRemaining_Mins;
public int ChargeTimeRemaining_Mins
{
get
{
return chargeTimeRemaining_Mins;
}
set
{
chargeTimeRemaining_Mins = value;
OnPropertyChanged("ChargeTimeRemaining_Mins");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}
ViewModel:
namespace WpfMVVMApp
{
public class CountdownViewModel
{
public CountdownModel Countdown { get; set; }
DispatcherTimer timer;
private const int maxMins = 360;
public CountdownViewModel()
{
Countdown = new CountdownModel { ChargeTimeRemaining_Mins = 60 };
//Setup timers
timer = new DispatcherTimer();
timer.Tick += new EventHandler(this.SystemChargeTimerService);
timer.Interval = new TimeSpan(0, 0, 1);
timer.Start();
}
private void SystemChargeTimerService(object sender, EventArgs e)
{
//convert to minutes remaining
//DEMO CODE - TODO: Remove
this.Countdown.ChargeTimeRemaining_Mins -= 1;
}
}
}
Hier ist der XAML-Code für mein Benutzer-Steuerung:
<UserControl x:Class="WpfMVVMApp.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>
<Label Name="Readout"></Label>
</Grid>
</UserControl>
Und hier ist der code hinter dem user-control:
namespace WpfMVVMApp
{
public partial class UserControl1 : UserControl
{
#region Dependency Properties
public static readonly DependencyProperty MinutesRemainingProperty =
DependencyProperty.Register
(
"MinutesRemaining", typeof(int), typeof(UserControl1),
new UIPropertyMetadata(10, new PropertyChangedCallback(minutesRemainChangedCallBack))
);
#endregion
public int MinutesRemaining
{
get
{
return (int)GetValue(MinutesRemainingProperty);
}
set
{
SetValue(MinutesRemainingProperty, value);
}
}
static void minutesRemainChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
UserControl1 _readout = (UserControl1)property;
_readout.MinutesRemaining = (int)args.NewValue;
_readout.Readout.Content = _readout.MinutesRemaining;
}
public UserControl1()
{
InitializeComponent();
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre änderung callback ist das brechen der Bindung.
Als ein Skelett: in dem Fenster haben Sie einen
UC.X="{Binding A}"
und dann in dieser Eigenschaft ändern (im UC) haben SieX=B;
. Das bricht die Bindung, da in beiden Fällen setzen SieX
.Zu beheben, entfernen, ändern, Rückruf und fügen Sie diese an die Bezeichnung:
Ich habe versucht dein code funktioniert gut, die einzige änderung, die ich gemacht habe war das entfernen der code-behind-propertychangedcallback, die Sie haben und die databind-Label (Auslesen), um die Abhängigkeit Eigenschaft.
USERCONTROL(XAML)
USERCONTROL (CODE BEHIND)