- 我强烈建议你避免这种设计,因为无论如何你最终实现它会给你的代码带来脆弱性而没有任何好处(我已经看到你正在聚合最大值和总和,为什么还要告诉我?)
- 如果你继续,摆脱那个“计算”文本框。文本框 = 输入文本。您只是重新表述设计表面中已有的内容。允许我更改您生成的文本是没有意义的。使用文本块或标签。
- 不要,我再说一遍,不要把它保存在你的活动中。这是所有 UI 任务,不应将此信息保存在您的 Activity 配置中
如果你有这个
public sealed class MyActivity : Activity
{
public string Compute {get;set;} // NO!
还有这个
<!-- NO! -->
<Label>Compute</Label><TextBox Text="{Binding ModelItem.Compute}"/>
你可能做错了。
你是怎么做到的?
您可以通过侦听ModelItem 中的更改并每次构造此字符串来解析您的 ModelItem 并生成此字符串。请注意,调用构造函数时不会设置您的 ModelItem,因此您将不得不监听ActivityDesigner.ModelItem属性的更改。这个没有事件,所以你必须知道如何监听 DependencyProperty 中的变化。
一旦您监听了 ModelItem 中的更改,无论何时发生更改,您都可以沿着 ModelItem(这很难)或只是从 ModelItem 获取 Activity 并检查它。
var child = ModelItem.Properties["Child"].Value.GetCurrentValue();
if(child == null)
computeTextBox.Text = "Please add some computation stuff.";
else
// hard stuff goes here...
沿着从 Activity 的子节点到其中包含的任何 Activity 的路径走下去可能是危险的,因为您不能假设您的用户已经抛出了一个序列而不是单个 MaxActivity,或者他们没有七个嵌套序列等. 所以你必须有一套相当复杂和脆弱的if
else
逻辑来尝试解析下面包含的内容。如果您开始在 ModelItem 之外更改 Activity 树的属性,您将与 UI 不同步。
现在,读完之后,回到第 1 点。我在这个答案中列出并遵循我的建议。彻底放弃这个想法。