用惯用法声明DataForm的当前项目?

时间:2010-10-06 14:24:26

标签: c# silverlight

我正在使用DataForm。到目前为止,我已经找到了两种方法来指定它的当前项:静态资源,或者在后面的代码中。

代码背后的初始化:

expenseDataForm.CurrentItem = new ExpenseInfo();

保存条目:

    private void expenseDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)
    {
        if (e.EditAction.Equals(DataFormEditAction.Commit))
        {
            // cast `sender` instead of hardcoding it to expenseDataForm?
            expenses.Add(expenseDataForm.CurrentItem as ExpenseInfo);
            expenseDataForm.CurrentItem = new ExpenseInfo();
        }
    }

改为使用资源:

<local:ExpenseInfo x:Key="newExpense"/>
<!-- ... -->

<df:DataForm CurrentItem="{StaticResource newExpense}" ... />

然后,当我去保存时,我遇到了问题:

    private void expenseDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)
    {
        if (e.EditAction.Equals(DataFormEditAction.Commit))
        {
            // cast `sender` instead of hardcoding it to expenseDataForm?
            expenses.Add(expenseDataForm.CurrentItem as ExpenseInfo);
            LayoutRoot.Resources["newExpense"] = new ExpenseInfo(); // crashes here
        }
    }

这在风格上是错误的吗?我已经读过静态资源应该通过应用程序存活,尽管这些费用信息对象显然不会。我应该采用代码隐藏的路线吗?

1 个答案:

答案 0 :(得分:1)

崩溃是因为您无法使用现有密钥为资源字典分配值。他们不支持替换。

您需要先致电LayoutRoot.Resources.Remove("newExpense")。然后你可以分配一个新的值。

在更广泛的问题上,你应该真正研究MVVM pattern。然后,当前选择将成为ViewModel的属性。建议不要使用资源来存储数据。代码背后是一个非常小的改进,但仍然有问题。