将UserControl与构造函数绑定到ViewModel

时间:2014-04-11 16:45:35

标签: c# wpf caliburn.micro caliburn

刚刚开始使用Caliburn和WPF,并坚持将带有参数的UserControl包含在我的窗口中。

有一个名为Item的类,其名为SellPrice的属性返回Money个对象。我想将此Money对象传输到UserControl以格式化此对象中的数据。我如何转移对象?我需要使用构造函数吗?

MainView.xaml

<DataGridTemplateColumn Header="Sell Price">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
            <local:MoneyControlView/>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn>

如果没有任何参数,上面的代码可以正常工作但是如何传递Money对象?

我确实尝试通过DependencyProperty执行此操作,如下所示:

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);
    }
}

但是,使用它时:

<local:MoneyControlView Money="{Binding BuyPrice}"/>

它不起作用。该物业仍为空。

2 个答案:

答案 0 :(得分:0)

从您的问题中不清楚ItemMoneyControlViewModel的关系。但是,列出的代码有几处可能的变化:

1)将Collection<Item>更改为ObservableCollection<Item>

2)假设Item类具有Money属性,返回MoneyControlViewModel ...在XAML中,更改DataGridTemplateColumn:

<DataGridTemplateColumn Header="Sell Price">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
            <ContentControl x:Name="SellPrice" cal:View.Model="{Binding Money}"/>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn>

这部分问题不明确:

  

如何为列表中的每个项目实现Money UserControl?   如果我获得了DataGrid的当前索引,那将不会有问题   命令从Item ...

中检索Money对象

看起来您可能需要ItemsControl并将DataTemplate与MoneyControl一起使用。这个问题可能有所帮助:ItemsControl ItemTemplate Binding

答案 1 :(得分:0)

在您的BuyPrice属性所包含的课程中,要求您实施INotifyPropertyChanged并在Setter的{​​{1}}上提升实施的方法{{ 1}}。