Silverlight, datagrid, autogenerated columns on mo

2019-08-04 01:51发布

问题:

I have a form, it has a grid.

I autogenerate the columns and tweak them as required:

    if (e.PropertyName == "id")
    {
        System.Windows.Style style = new Style(typeof(DataGridCell));
        style.Setters.Add(new Setter(DataGridCell.ContentTemplateProperty, CreateBtnTemplate(30)));
        e.Column.CellStyle = style;
    }
    private static DataTemplate CreateBtnTemplate(int width)
    {
        string str = "<DataTemplate xmlns='http://schemas.microsoft.com/client/2007' >"
                      //+ "<Button Tag='{Binding id}' Content='Respond'                 
                      + "<Button Tag='{Binding id}' Content='Respond' "
                      + "Visibility='{Binding id,  Converter={StaticResource myConverter}}'"
                      + " />"
                      + "</DataTemplate>";
        return (DataTemplate)XamlReader.Load(str);
    }

In my pages xaml, I have:

<Grid x:Name="LayoutRoot" Margin="0,0,4,0">
    <Grid.Resources>
        <my:EnableDisableConverter x:Name="myConverter" x:Key="myConverter"></my:EnableDisableConverter>
    </Grid.Resources>

My class looks like:

public class EnableDisableConverter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Service1failedbackups f = value as Service1failedbackups;
        if (f.resolution == null || f.resolution == "")
            return System.Windows.Visibility.Visible;
        else
            return System.Windows.Visibility.Collapsed;
    }
    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {        return null;
    }
}

In short, if the content of "resolution" is blank, I want a button so I it can be filled in, via a popup window.

Now, it all compiles, it all looks good. (my is defined as

xmlns:my="clr-namespace:SilverlightApplication1"

as part of the page header.

The error I get is:

Error: Unhandled Error in Silverlight Application 
Code: 2272    
Category: ParserError       
Message: Cannot find a Resource with the Name/Key myConverter     
File:      
Line: 1     
Position: 121     

Now, its all OK until I put the visibility part of my btnTemplate in. I've used the ID column specifically because, I dont need users to see it.

Please, can someone tell me what I missed. This is driving me nuts.

回答1:

I fixed it

Heres how.

in my xaml file I added

xmlns:converter="clr-namespace:SilverlightApplication1"

and then under grid I added

    <converter:EnableDisableConverter x:Name="myConverter" x:Key="myConverter" />
    <DataTemplate x:Key="DataTemplate" >
        <Button Visibility='{Binding Converter={StaticResource myConverter}}' Content='Respond' Click="btnRespond_Click" />
    </DataTemplate>
    <DataTemplate x:Key="err" >
        <TextBlock Text='{Binding err}' FontSize='8'  TextWrapping='Wrap'/>
    </DataTemplate>
    <DataTemplate x:Key="resolution" >
        <TextBlock Text='{Binding resolution}' FontSize='8'  TextWrapping='Wrap'/>
    </DataTemplate>
</Grid.Resources>

I then ditched all the auto generating of my columns and set

    <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn  CellTemplate="{StaticResource DataTemplate}" Header="Action" Width="Auto" />
        <sdk:DataGridTextColumn Binding="{Binding server}"  Header="server" Width="Auto" />
        <sdk:DataGridTextColumn Binding="{Binding software}"  Header="software" Width="Auto" />
        <sdk:DataGridTextColumn Binding="{Binding backupgroup}"  Header="backupgroup" Width="Auto" />
        <sdk:DataGridTemplateColumn  CellTemplate="{StaticResource err}" Header="Action" Width="250" />
        <sdk:DataGridTemplateColumn  CellTemplate="{StaticResource resolution}" Header="Action" Width="150" />
        <sdk:DataGridTextColumn Binding="{Binding resolver}"  Header="resolver" Width="Auto" />
    </sdk:DataGrid.Columns>

NOW it works. NOW it flipping works.. hurrah