2011-01-20 2 views
1

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

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

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

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

Вот код XMLDataProdider, который генерирует контент внутри DataGrid. Я попытался передать значение «команда» как строка:

<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 [email protected]}" >   
       <TextBlock Text="{Binding [email protected]}" />             
      </Hyperlink>       
     </TextBlock>  
    </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate>    
</DataGridTemplateColumn> 

ответ

2

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

Command="{Binding [email protected], Converter={StaticResource MyStringToCommandConverter}}" 

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

<MyStringToCommandConverter x:Key="MyStringToCommandConverter"/> 

Другого, чем вам просто нужно создать MyStringToCommandConverter (или что-то вам name it) класс, реализующий 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(); 
    } 
} 
+0

Мне интересно, есть ли у вас образец этого IValueConverter. Спасибо. – vladc77

+0

Добавлен образец конвертера. –

+0

Это супер круто. Теперь он отлично работает. Большое спасибо! Я очень ценю вашу помощь! – vladc77

Смежные вопросы