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

У меня есть сценарий, где мне нужно изменить имя гиперссылки в сетке данных после проверки RadioButton, который находится в отдельном окне «Опции». Я запускаю это окно «Option», используя ICommand, назначенную той же гиперссылке. У меня проблемы с переименованием имени гиперссылки. Гиперссылки генерируются из XML с использованием XMLDataProvider. Я также использую IValueConverter, который преобразует XML-строку в ICommand. Я надеюсь найти решение здесь. Заранее спасибо.

Ссылка на решение для тестирования: http://cid -0c29483cf3a6a14d.office.live.com / self.aspx / WPF% 5E_Tests / RenameHyperlinkText.zip

Код ниже.

Создание таблицы данных с гиперссылками XAML в главном окне:

<Window.Resources>
    <local:MyStringToCommandConverter x:Key="MyStringToCommandConverter"/>
    <XmlDataProvider x:Key="MainDataGridLocal" XPath="ServicesTiles/Servers">
        <x:XData>
            <ServicesTiles xmlns="">
              <Servers Name="Name 1" Status="None" Name2="Name 2" Status2="Never" Command="LaunchOptionsWindowCommand" />
              <Servers Name="Name 3" Status="none"  Name2="Name 4" Status2="None" />
            </ServicesTiles>
        </x:XData>
    </XmlDataProvider>
</Window.Resources> 
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MainDataGridLocal}}">
    <DataGrid x:Name="MainGrid" AutoGenerateColumns="False" ItemsSource="{Binding XPath=/ServicesTiles/Servers}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding XPath=@Name}" />  
            <DataGridTemplateColumn >     
                <DataGridTemplateColumn.CellTemplate>         
                    <DataTemplate>             
                        <TextBlock >
                            <Hyperlink Command="{Binding XPath=@Command, Converter={StaticResource MyStringToCommandConverter}}" >                
                                    <TextBlock Text="{Binding XPath=@Status}" />
                            </Hyperlink>
                        </TextBlock>         
                    </DataTemplate>     
                </DataGridTemplateColumn.CellTemplate>                          
            </DataGridTemplateColumn> 
            <DataGridTextColumn Binding="{Binding XPath=@Status2}"/>
            <DataGridTemplateColumn >     
                <DataGridTemplateColumn.CellTemplate>         
                    <DataTemplate>             
                        <TextBlock >
                            <Hyperlink >                   
                                <TextBlock Text="{Binding XPath=@Status2}" />
                            </Hyperlink>
                        </TextBlock>         
                    </DataTemplate>     
                </DataGridTemplateColumn.CellTemplate>                          
            </DataGridTemplateColumn> 
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Код для запуска команды:

public partial class MainWindow : Window
{

public static RoutedUICommand OptionsWindowCommand = new RoutedUICommand("Options...", "Options", typeof(MainWindow));

    public MainWindow()
    {
        this.InitializeComponent();
        this.CommandBindings.Add(new CommandBinding(OptionsWindowCommand, OptionsWindowCommandExecuted));
    }
    private void OptionsWindowCommandExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        OptionsWindow theDialog = new OptionsWindow();
        if ( theDialog != null )
            theDialog.ShowDialog();
    }
}

Опции окна XAML с радиокнопками и кнопкой ОК:

<Grid x:Name="LayoutRoot" Height="250" VerticalAlignment="Top">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Button Content="Cancel" VerticalAlignment="Bottom" Margin="0,0,20,0" OpacityMask="#FFE0DADA" IsCancel="True" HorizontalAlignment="Right" Width="75"/>
    <Button Content="OK" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="75" Margin="0,0,103.06,0" IsDefault="True" />
    <StackPanel HorizontalAlignment="Center"  Width="158" VerticalAlignment="Center">
        <RadioButton x:Name="a_RD" Content="1_RD" Height="25"/>
        <RadioButton x:Name="b_RD" Content="2_RD;" IsChecked="True" Height="25"/>
        <RadioButton x:Name="c_RD" Content="3_RD" Height="25"/>
    </StackPanel>
</Grid>

1 Ответ

1 голос
/ 21 января 2011

Я не уверен, что полностью понял ваш вопрос, но в любом случае я принял удар. Вы можете использовать CommandParameter для отправки параметра с помощью команды. Если вы используете CommandParameter="{Binding}", вы получите соответствующий XmlLinkedNode для строки, по которой щелкнули (то есть ее DataContext), и оттуда вы можете получить доступ к атрибутам в ней.

<DataGridTemplateColumn >     
    <DataGridTemplateColumn.CellTemplate>         
        <DataTemplate>             
            <TextBlock >
                <Hyperlink Command="{Binding XPath=@Command, Converter={StaticResource MyStringToCommandConverter}}"
                           CommandParameter="{Binding}">
                    <TextBlock Text="{Binding XPath=@Status}" />
                </Hyperlink>
            </TextBlock>
        </DataTemplate>     
    </DataGridTemplateColumn.CellTemplate>                          
</DataGridTemplateColumn>

Тогда вы могли бы сделать что-то подобное в OptionsWindowCommandExecuted. Могу добавить, что я не очень знаком с XmlDataProvider, поэтому Attributes["Status"].Value может быть не рекомендуемым способом:)

private void OptionsWindowCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{
    OptionsWindow theDialog = new OptionsWindow();
    XmlLinkedNode xmlLinkedNode = e.Parameter as XmlLinkedNode;
    if (theDialog != null)
    {
        if (theDialog.ShowDialog() == true)
        {
            xmlLinkedNode.Attributes["Status"].Value = "Available";
        }
    }
}

Обновление
Пример кода для установки различных значений в зависимости от того, какой RadioButton пользователь проверил

В OptionsWindow.xaml.cs

public string CheckedRadioButtonContent
{
    get;
    set;
}

private void OKButton_Click(object sender, RoutedEventArgs e)
{
    if (a_RD.IsChecked == true)
    {
        CheckedRadioButtonContent = a_RD.Content.ToString();
    }
    else if (b_RD.IsChecked == true)
    {
        CheckedRadioButtonContent = b_RD.Content.ToString();
    }
    else if (c_RD.IsChecked == true)
    {
        CheckedRadioButtonContent = c_RD.Content.ToString();
    }
    DialogResult = true;
}

MainWindow.xaml.cs

private void OptionsWindowCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{
    OptionsWindow theDialog = new OptionsWindow();
    XmlLinkedNode xmlLinkedNode = e.Parameter as XmlLinkedNode;
    if (theDialog != null)
    {
        if (theDialog.ShowDialog() == true)
        {
            string checkedRadioButtonContent = theDialog.CheckedRadioButtonContent;
            xmlLinkedNode.Attributes["Status"].Value = "Available_" + checkedRadioButtonContent;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...