Делаем привязку стиля более гибкой - PullRequest
2 голосов
/ 20 февраля 2011

Я пытаюсь сделать существующий стиль более гибким. Я прилагаю деп. свойство события двойного щелчка элемента управления строк сетки данных. При двойном щелчке по строке я хочу открыть определенное окно. Чтобы добиться этого, я реализовал dep. свойство и добавил определение стиля. Ниже часть из файла представления:

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

прикрепленное свойство привязывается к событию двойного щелчка в строке данных и выполняет команду реле, привязанную к представлению. Я хотел бы обеспечить большую гибкость в стиле указав имя вызываемой команды в самом представлении (поскольку оно может различаться в разных представлениях). Как я могу этого достичь? Есть ли какое-то определение шаблона, которое мне не хватает? Любая помощь будет принята с благодарностью:)

1 Ответ

2 голосов
/ 20 февраля 2011

Вы можете создать подкласс DataGrid и добавить свойство для команды, например, MyCommand. Затем вы можете связать эту ICommand в каждом DataGrid и использовать MyCommand в качестве пути в привязке RowStyle

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); }
    }
}

Кроме того, вы можете создать вложенное свойство, например MyCommand, которое вы используете

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);
}
...