gpt4 book ai didi

c# - 将事件/命令与 XamlReader 一起使用

转载 作者:行者123 更新时间:2023-11-30 15:10:12 27 4
gpt4 key购买 nike

我正在使用 XamlReader.Parse(string) 动态构建我的数据模板。我遇到的问题是我无法将任何事件放在我使用 XamlReader 创建的任何控件上。在网上做了一些研究后,我了解到这是 XamlReader 的一个已知限制。

我不太了解 WPF 中的命令,但我能否以某种方式使用它们来获得相同的结果?如果是这样怎么办?如果没有,我可以通过使用 Xaml Reader 创建的控件处理我的代码中的事件吗?

下面是我创建的数据模板的示例。我在将托管此数据模板的窗口的代码隐藏中定义了 MenuItem_Click 事件处理程序。

尝试运行它时出现以下错误:System.Windows.Markup.XamlParseException 未处理:无法从文本“MenuItem_Click”创建“Click”。

DataTemplate result = null;
StringBuilder sb = new StringBuilder();

sb.Append(@"<DataTemplate
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Grid Width=""Auto"" Height=""Auto"">

<TextBlock Text=""Hello"">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem
Header=""World""
Click=""MenuItem_Click""></MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>

</Grid>
</DataTemplate>");

result = XamlReader.Parse(sb.ToString()) as DataTemplate;

最佳答案

希望迟到的回答可能对其他人有帮助:

我发现我需要在解析后绑定(bind)事件,并且必须从 Xaml 字符串中删除点击事件。

在我的场景中,我将生成的 DataTemplate 应用到 ItemTemplate,连接 ItemSource,然后添加处理程序。这确实意味着所有项目的点击事件都是相同的,但在我的例子中,标题是所需的信息并且方法是相同的。

//Set the datatemplate to the result of the xaml parsing.
myListView.ItemTemplate = (DataTemplate)result;

//Add the itemtemplate first, otherwise there will be a visual child error
myListView.ItemsSource = this.ItemsSource;

//Attach click event.
myListView.AddHandler(MenuItem.ClickEvent, new RoutedEventHandler(MenuItem_Click));

然后点击事件需要返回到原始源,在我的例子中,发送者将是使用 DataTemplate 的 ListView。

internal void MenuItem_Click(object sender, RoutedEventArgs e){
MenuItem mi = e.OriginalSource as MenuItem;
//At this point you can access the menuitem's header or other information as needed.
}

关于c# - 将事件/命令与 XamlReader 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3532287/

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