gpt4 book ai didi

c# - 在 Silverlight 中使用字符串作为数据表单的数据模板时的事件处理程序

转载 作者:太空狗 更新时间:2023-10-29 20:36:58 25 4
gpt4 key购买 nike

我正在尝试使用字符串以编程方式为数据表单形成一些 xaml。我可以让组合框出现。但是当我尝试使用在字符串中指定“MouseLeftButtonUp”或“Loaded”事件处理程序的代码时;进入页面后,页面将变为白色(无明显错误)。请参阅下面的相关代码。

     StringBuilder editTemplate = new StringBuilder("");
editTemplate.Append("<DataTemplate ");
editTemplate.Append("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
editTemplate.Append("xmlns:toolkit='http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit' ");
editTemplate.Append("xmlns:navigation='clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation' ");
editTemplate.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' >");
editTemplate.Append("<StackPanel>");
editTemplate.Append(@" <toolkit:DataField Label='" + GetFieldWithoutNumber(theInfo, theDataContext) + "'>");
/* Won't Work */ editTemplate.Append(@" <ComboBox MouseLeftButtonUp='ComboBox_MouseLeftButtonUp' />");
/* Will Work */ editTemplate.Append(@" <ComboBox />");
editTemplate.Append(@" </toolkit:DataField>");
editTemplate.Append("</StackPanel></DataTemplate>");
dynamicDataForm.EditTemplate = XamlReader.Load(editTemplate.ToString()) as DataTemplate;

最佳答案

连接到 XAML 中的事件处理程序需要在连接到 XAML 文件的代码隐藏中声明。对于 ResourceDictionary 或从 XamlReader.Load 加载的任何内容,不能有任何代码隐藏,因此不能在 XAML 中设置事件处理程序。绕过此限制的最简单方法是不从字符串构建模板,而只是在 XAML 文件的资源部分声明它,然后您可以这样做:

Resources["MyTemplate"] 作为数据模板

获取模板并在代码中分配它,就像您在此处所做的那样,或者只在 XAML 中使用 StaticResource。只要它保留在连接到此代码的同一个 XAML 文件中,您当前拥有的事件处理程序就应该可以正常工作。字符串的动态部分也需要更改为使用绑定(bind)。

如果您想坚持使用 XamlReader 方法,则有 2 个问题需要解决。

  1. 在呈现的模板中找到 ComboBox 实例
  2. 等到模板呈现后寻找组合框

要找到 ComboBox,您首先需要在模板文本中为其指定一个 x:Name 属性(您可以只替换当前存在的事件代码)。接下来,您需要能够按名称在可视化树中定位项目。这相当简单,您可以找到 example here这样做。

要在正确的时间调用此代码,您需要覆盖 OnApplyTemplate,不幸的是,如果您在 UserControl 之类的东西中,它将无法工作,或者使用另一个技巧来阻止它运行,直到呈现所有控件。这是一个完整的示例,可以进入构造函数并使用从上面链接的查找方法:

DataTemplate template = Resources["MyTemplate"] as DataTemplate;
dynamicDataForm.ContentTemplate = template;

Dispatcher.BeginInvoke(() =>
{
ComboBox button = FindVisualChildByName<ComboBox>(this, "MyControl");
if (button != null)
button.MouseLeftButtonUp += (s, _) => MessageBox.Show("Click");
});

在你的情况下,看起来你的模板可能需要等待在呈现之前切换到编辑状态,在这种情况下你需要推迟连接事件并在你的数据表单上找到其他事件状态改变了。

关于c# - 在 Silverlight 中使用字符串作为数据表单的数据模板时的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14188649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com