开发者

Making the style's binding more flexible

开发者 https://www.devze.com 2023-02-12 08:21 出处:网络
I\'m trying to make the existing style more flexible. I\'m attaching a dep. property to the double click event of the data grid row control.

I'm trying to make the existing style more flexible. I'm attaching a dep. property to the double click event of the data grid row control. On double-clicking the row i want a certain window to open. To achieve this I've implemented a dep. property and added a style definition. Below is the part from the view file:

<Style x:Key="SomeKey" TargetType={x:Type DataGridRow} BasedOn= "SomeOtherKey">
    <Setter Property="vm:DataGridBehavior:OnDoubleClick" Value="{Binding Path=CommandName,
RelativeSource={RelativeSource AncestorType=开发者_StackOverflow社区{x:Type DataGrid}}}">
    </Setter>
</Style>

the attached property hooks to the double-click event on the data row and executes the relay command bound to the view. I'd like to enable more flexibility in the style by specifying the command-to-be-invoked name in the view itself (as it may differ between different views). How can I achieve that? Is there any template definition that I'm missing? Any help would be greatly appreciated :)


You could subclass DataGrid and add a Property for the Command, e.g MyCommand. Then you could bind that ICommand in each DataGrid and use MyCommand as Path in the RowStyle Binding

DataGrids

<local:CommandDataGrid RowStyle="{StaticResource SomeKey}"
                       MyCommand="{Binding CommandName1}">
<!-- ... -->
<local:CommandDataGrid RowStyle="{StaticResource SomeKey}"
                       MyCommand="{Binding CommandName2}">

RowStyle

<Style x:Key="SomeKey" TargetType="{x:Type DataGridRow}">
    <Setter Property="vm:DataGridBehavior.OnDoubleClick"
            Value="{Binding Path=MyCommand,
                            RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
</Style>

CommandDataGrid

public class CommandDataGrid : DataGrid
{
    public static readonly DependencyProperty MyCommandProperty =
        DependencyProperty.Register("MyCommand",
                                    typeof(ICommand),
                                    typeof(CommandDataGrid),
                                    new UIPropertyMetadata(null));

    public ICommand MyCommand
    {
        get { return (ICommand)GetValue(MyCommandProperty); }
        set { SetValue(MyCommandProperty, value); }
    }
}

Alternatively, you could create an attached property e.g MyCommand that you use

DataGrid

<DataGrid vm:DataGridBehavior.MyCommand="{Binding CommandName}"

RowStyle

<Style x:Key="SomeKey" TargetType="{x:Type DataGridRow}">
    <Setter Property="vm:DataGridBehavior.OnDoubleClick"
            Value="{Binding Path=(vm:DataGridBehavior.MyCommand),
                            RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
</Style>

MyCommandProperty

public static readonly DependencyProperty MyCommandProperty =
    DependencyProperty.RegisterAttached("MyCommand",
                                        typeof(ICommand),
                                        typeof(DataGridBehavior),
                                        new UIPropertyMetadata(null));
public static void SetMyCommand(DependencyObject element, ICommand value)
{
    element.SetValue(MyCommandProperty, value);
}
public static ICommand GetMyCommand(DependencyObject element)
{
    return (ICommand)element.GetValue(MyCommandProperty);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消