Button inside a column header

2 posts, 0 answers
  1. Vicenc
    Vicenc avatar
    2 posts
    Member since:
    Mar 2015

    Posted 29 Jul 2015 Link to this post

    Hi, I'm trying to create a button inside a column header and I'm facing binding problems. My code looks like this:

     

    <telerik:RadGridView
                Name="RadGridView"
                CanUserSortColumns="False"
                ItemsSource="{Binding Stations}"
                IsFilteringAllowed="False"
                RowIndicatorVisibility="Collapsed"
                NewRowPosition="None"
                AutoGenerateColumns="False"
                IsReadOnly="True"
                ShowGroupPanel="False">
                <telerik:RadGridView.SortDescriptors>
                    <telerik:SortDescriptor Member="Number" SortDirection="Ascending" />
                </telerik:RadGridView.SortDescriptors>
                <telerik:RadGridView.Columns>
                    <telerik:GridViewDataColumn IsSortable="False">
                        <telerik:GridViewDataColumn.Header>
                            <Button
                                Style="{DynamicResource BorderlessButtonStyle}"
                                Loaded="FrameworkElement_OnLoaded"
                                BorderThickness="0"
                                Click="ButtonBase_OnClick"
                                Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerik:RadGridView}},Path=DataContext.CopyCommand}"
                                >
                       </telerik:GridViewDataColumn.Header>
                       ...

    But the command is never invoked due to this error:

    System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Telerik.Windows.Controls.RadGridView', AncestorLevel='1''. BindingExpression:Path=DataContext.CopyCommand; DataItem=null; target element is 'Button' (Name=''); target property is 'Command' (type 'ICommand') 

    I've tried with other Ancestor levels with no luck.

    I tried to workaround this problem setting the command in the Loaded event of the button and it works, but I have a similar problem trying to set a Binding with a converter for Visibility in code behind:

    private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
    {
        var button = (Button)sender;
     
        var viewModel = (TotalTideViewModel)this.DataContext;
     
        button.Command = viewModel.CopyCommand;
        var converter = new Converters.BooleanToVisibilityConverter();
        button.SetBinding(VisibilityProperty, new Binding("DataContext.IsAnyRowSelected")
            {
                Converter = converter
            });
    }

    I've seen in another threads that you recommend to create a static resource with the view model, but we are working using our client's framework and we are not allowed to do that.

     

    How can I create a proper binding?

     

    Thanks,

    Vicenc

     

     

     

     

     

     

  2. Vicenc
    Vicenc avatar
    2 posts
    Member since:
    Mar 2015

    Posted 29 Jul 2015 in reply to Vicenc Link to this post

    Hi,

    looks like I was creating the binding in the wrong way. That's the code is working:

     

    private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
    {
        var button = (Button)sender;
     
        var viewModel = (TotalTideViewModel)this.DataContext;
     
        button.Command = viewModel.CopyCommand;
        var converter = new Converters.BooleanToVisibilityConverter();
        button.SetBinding(VisibilityProperty, new Binding()
        {
            Converter = converter,
            RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(RadGridView), 1),
            Path = new PropertyPath("DataContext.IsAnyRowSelected")
        });
    }

     

    Thanks,

    Vicenc

  3. UI for WPF is Visual Studio 2017 Ready
Back to Top