如何从XML转换字符串以返回ICommand?

时间:2011-01-20 01:07:13

标签: wpf binding wpfdatagrid

我需要能够将唯一命令传递给在DataGrid中从XML生成的超链接。

如果我以这种方式将它们直接指向超链接,那么我在该工作背后的代码中有命令。

<Hyperlink Style="{DynamicResource DataGridCellStyleHyperlink}" Command="{x:Static local:MainWindow.LaunchFirstCommand}">   

我需要做类似的事情,但动态地为单元格内的每个超链接分配不同的命令。所有超链接都是从XML生成的。我相信我需要有某种转换器才能做到这一点。我无法使其正常工作。任何建议都非常感谢。提前谢谢。

这是在DataGrid中生成内容的XMLDataProdider代码。我试图将'Command'值作为字符串传递:

<XmlDataProvider x:Key="MoreInfoDataGridLocal" XPath="MoreInfoTiles/Servers">
       <x:XData> 
        <MoreInfoTiles xmlns="">
         <Servers Name="Test1" Status="003" Name2="Connection 2" Status2="assigned" />
             <Servers Name="Test2" Status="Not activated" Name2="Address" Status2="test" />
             <Servers Name="Test3" Status="Disabled" Name2="Address" Status2="None" Command="x:Static local:MainWindow.LaunchFirstCommand"/>
        </MoreInfoTiles>
       </x:XData>
  </XmlDataProvider>

我可以成功生成文本字符串,但命令没有做任何事情。下面是我将它连接到datagrid中的超链接的代码:

<DataGridTemplateColumn>   
<DataGridTemplateColumn.CellTemplate>     
    <DataTemplate>       
        <TextBlock >         
            <Hyperlink Style="{DynamicResource DataGridCellStyleHyperlink}" Command="{Binding XPath=@Command}" >           
                <TextBlock Text="{Binding XPath=@Status}" />                                                   
            </Hyperlink>                         
        </TextBlock>     
    </DataTemplate>   
    </DataGridTemplateColumn.CellTemplate>             
</DataGridTemplateColumn>

1 个答案:

答案 0 :(得分:2)

是的,您需要使用IValueConverter将字符串转换为命令对象。您的命令绑定将如下所示:

Command="{Binding XPath=@Command, Converter={StaticResource MyStringToCommandConverter}}"

您将需要一个作为资源创建的转换器实例:

<MyStringToCommandConverter x:Key="MyStringToCommandConverter"/>

除此之外,您只需要创建MyStringToCommandConverter(或任何您命名的)类,实现IValueConverter,并在Convert方法中将“value”字符串转换为您的一个路由命令。一个简单的转换器看起来像这样:

public class MyStringToCommandConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string commandType = value as String;
        if (commandType == "LaunchFirstCommand")
            return MainWindow.LaunchFirstCommand;
        if (commandType == "OtherCommand")
            return MainWindow.OtherCommand;
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }
}