Как преобразовать строку из XML, чтобы вернуть ICommand? - PullRequest
1 голос
/ 20 января 2011

Мне нужно иметь возможность передавать уникальные команды гиперссылкам, сгенерированным из XML в DataGrid.

У меня есть команды в коде этой работы, если я указываю их прямо на гиперссылки таким образом.

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

Мне нужно сделать подобное, но динамически назначать разные команды каждой гиперссылке внутри ячеек.,Все гиперссылки генерируются из XML.Я верю, что мне нужен какой-то конвертер, который это сделает.У меня проблемы с тем, чтобы это сработало.Любой совет высоко ценится.Заранее спасибо.

Вот код XMLDataProdider, который генерирует контент внутри DataGrid.Я попытался передать значение '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>

Я могу успешно сгенерировать текстовые строки, но команда ничего не делает.Ниже приведен код, где я подключаю его к гиперссылке в сетке данных:

<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 Ответ

2 голосов
/ 20 января 2011

Да, вам нужно будет использовать IValueConverter для перевода строки в командный объект. Ваша команда Binding будет выглядеть так:

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

и вам понадобится экземпляр конвертера, созданный как ресурс:

<MyStringToCommandConverter x:Key="MyStringToCommandConverter"/>

Кроме этого вам просто нужно создать класс MyStringToCommandConverter (или как вы его называете), реализующий IValueConverter, и в методе Convert преобразовать строку «значение» в одну из ваших маршрутизируемых команд. Простой конвертер будет выглядеть примерно так:

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();
    }
}
...