Ligação de um UserControl com um construtor para ViewModel
-
21-12-2019 - |
Pergunta
Só comecei a usar Caliburn e WPF e ficou preso em incluindo um UserControl com um parâmetro para a minha Janela.
Tenho uma classe chamada Item
com uma propriedade chamada SellPrice
que retorna um Money
objecto.Eu quero transferir esse Money
objeto para um UserControl para formatar os dados deste objeto.Como faço para transferir o objeto?Eu preciso usar o construtor?
MainView.xaml
<DataGridTemplateColumn Header="Sell Price">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:MoneyControlView/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Código acima funciona bem se não existisse qualquer parâmetro, mas como faço para passar o Money
objeto?
Eu tentei fazê-lo através de DependencyProperty da seguinte forma:
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);
}
}
No entanto, quando usá-lo:
<local:MoneyControlView Money="{Binding BuyPrice}"/>
ele não funciona.a Propriedade permanece vazio.
Solução
Não está claro a partir de sua pergunta, como um Item
refere-se a uma MoneyControlViewModel
.Existem várias possibilidades de mudanças para o código, que:
1) Alterar Collection<Item>
para ObservableCollection<Item>
2) Supondo que o Item
a classe tem um Money
propriedade que retorna um MoneyControlViewModel
...No XAML, alterar o DataGridTemplateColumn:
<DataGridTemplateColumn Header="Sell Price">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl x:Name="SellPrice" cal:View.Model="{Binding Money}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Esta parte da sua pergunta não está clara:
Como faço para implementar o Dinheiro UserControl para cada Item na minha lista?Não seria um problema se eu tenho o índice atual de DataGrid em a fim de recuperar o Dinheiro objeto do Item...
Parece que você pode desejar um ItemsControl e usar um DataTemplate com um MoneyControl.Esta questão pode ajudar: ItemsControl ItemTemplate Ligação
Outras dicas
Sobre a classe a que a BuyPrice
propriedade contém, requer que você para implementar INotifyPropertyChanged
e no Setter
do BuyPrice
você tem que levantar o método implementado OnRaisedPropertyChanged("BuyPrice") (.Net 4.0)
.