将资源传递给XamlReader

时间:2017-10-01 03:53:23

标签: xaml uwp

我正在使用XamlReader::Load来解析DataTemplate。是否可以传递值转换器等静态资源?另外,有没有办法在加载后修改结果DataTemplate;例如,附加事件处理程序?

1 个答案:

答案 0 :(得分:0)

  

是否可以传递值转换器等静态资源?

是。你可以做到这一点。您只需要注意Any custom assemblies referenced in a XAML namespace mapping must already be available to the application.

我已经提供了代码示例供您参考,我的代码是C#代码,但是datatemplate字符串是相同的。

namespace AppXamlLoad
{
    public class MyConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return "test";
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}
StringBuilder sbTemp = new StringBuilder();
sbTemp.Append("<DataTemplate ");
sbTemp.Append("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");        
sbTemp.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' ");
sbTemp.Append("xmlns:local='using:AppXamlLoad'>");
sbTemp.Append("<Grid>");
sbTemp.Append("<Grid.Resources>");
sbTemp.Append("<local:MyConverter x:Key='myconverter'></local:MyConverter>");
sbTemp.Append("</Grid.Resources>");
sbTemp.Append("<TextBox Margin='2'");
sbTemp.Append(" Text='{Binding");
sbTemp.Append(" Converter={StaticResource myconverter}}'/>");
sbTemp.Append("</Grid>");
sbTemp.Append("</DataTemplate>");
DataTemplate dt = XamlReader.Load(sbTemp.ToString()) as DataTemplate;
mylsiview.ItemTemplate = dt; //mylistview is my listview control in xaml page
  

有没有办法在加载后修改生成的DataTemplate;例如,附加事件处理程序?

是。

  

对象创建逻辑无法在运行时将加载的XAML与代码隐藏类集成。如果要添加事件处理程序,则必须通过引用从Load结果的对象树结构中获取的对象并使用特定于语言的语法来附加处理程序来在代码中执行此操作。来自MSDN

Jerry Nixon回复了一个类似的主题,详情请参阅:Handle an event in a Data Template loaded by XamlReader.Load(xaml) in code-behind