Binden eines UserControl mit einem Konstruktor an ViewModel
-
21-12-2019 - |
Frage
Ich habe gerade angefangen, Caliburn und WPF zu verwenden, und bin dabei steckengeblieben, ein UserControl mit einem Parameter in mein Fenster einzufügen.
Habe eine Klasse benannt Item
mit einer Eigenschaft namens SellPrice
was a zurückgibt Money
Objekt.Ich möchte das übertragen Money
Objekt zu einem UserControl, um die Daten in diesem Objekt zu formatieren.Wie übertrage ich das Objekt?Muss ich den Konstruktor verwenden?
MainView.xaml
<DataGridTemplateColumn Header="Sell Price">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:MoneyControlView/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Der obige Code funktioniert gut, wenn es keinen Parameter gäbe, aber wie übergebe ich den Money
Objekt?
Ich habe versucht, es über DependencyProperty wie folgt zu tun:
public partial class MoneyControlView : UserControl
{
public static readonly DependencyProperty MoneyProperty = DependencyProperty.Register
(
"Money",
typeof(Money),
typeof(MoneyControlView),
new PropertyMetadata(new Money())
);
public Money Money
{
get { return (Money)GetValue(MoneyProperty); }
set { SetValue(MoneyProperty, value); }
}
public MoneyControlView()
{
InitializeComponent();
DataContext = new MoneyControlViewModel(Money);
}
}
Bei der Verwendung gilt jedoch Folgendes:
<local:MoneyControlView Money="{Binding BuyPrice}"/>
es funktioniert nicht.die Immobilie bleibt leer.
Lösung
Aus Ihrer Frage geht nicht klar hervor, wie ein Item
bezieht sich auf a MoneyControlViewModel
.Es gibt jedoch mehrere mögliche Änderungen am aufgeführten Code:
1) Veränderung Collection<Item>
Zu ObservableCollection<Item>
2) Angenommen, das Item
Klasse hat eine Money
Eigenschaft, die a zurückgibt MoneyControlViewModel
...Ändern Sie im XAML die DataGridTemplateColumn:
<DataGridTemplateColumn Header="Sell Price">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl x:Name="SellPrice" cal:View.Model="{Binding Money}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Dieser Teil Ihrer Frage ist nicht klar:
Wie implementieren ich das Money UserControl für jedes Element in meiner Liste?Wäre kein Problem, wenn ich den aktuellen Index des Datagrids bekommen würde, um das Geldobjekt aus dem Artikel abzurufen ...
Es sieht so aus, als ob Sie ein ItemsControl wünschen und ein DataTemplate mit einem MoneyControl verwenden möchten.Diese Frage könnte helfen: ItemsControl ItemTemplate-Bindung
Andere Tipps
Auf der Klasse, die Ihr BuyPrice
Die darin enthaltene Eigenschaft erfordert eine Implementierung INotifyPropertyChanged
und auf der Setter
des BuyPrice
Sie müssen die implementierte Methode erhöhen OnRaisedPropertyChanged("BuyPrice") (.Net 4.0)
.