Сложно объяснить, но я сделаю все возможное.Я хотел иметь многократно используемый элемент управления с тремя кнопками, одна для создания сущностей, другая для редактирования и другая для удаления, вот сокращенный XAML соответствующей части.
-
<!-- ActionButtons.xaml -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
<Button Name="btnNew" Content="New" Command="{Binding Path=NewCommand}" />
<Button Name="btnEdit" Content="Edit" Command="{Binding Path=EditCommand, Mode=OneWay}" />
<Button Name="btnDelete" Content="Delete" Command="{Binding Path=DeleteCommand, Mode=OneWay}" />
</StackPanel>
-
Затем в приведенном ниже коде у меня есть объявления dpprops:
// ActionButtons.xaml.cs
public uscActionButtons()
{
InitializeComponent();
this.DataContext = this;
}
public ICommand NewCommand
{
get { return (ICommand)GetValue(NewCommandProperty); }
set { SetValue(NewCommandProperty, value); }
}
// Using a DependencyProperty as the backing store for NewCommand. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NewCommandProperty =
DependencyProperty.Register("NewCommand", typeof(ICommand), typeof(uscActionButtons), new UIPropertyMetadata(null, new PropertyChangedCallback(OnCommandChanged)));
Я хотел связать свойство NewCommand с его конкретной реализацией в другом элементе управления.Пример предполагаемого использования:
<!-- SomeControl.xaml -->
<common:uscActionButtons Grid.Row="0" HorizontalAlignment="Left"
NewCommand="{Binding NewItemCommand}"
/>
И
// SomeControlViewModel.cs
// Note: SomeControlViewModel IS in the DataContext of SomeControl.
public ICommand NewItemCommand
{
get
{
if (mNewItemCommand == null)
{
mNewItemCommand = new RelayCommand(x => this.CreateItem());
}
return mNewItemGroupCommand;
}
}
Проблема заключается в том, что повторно используемый элемент управления (ActionButtons) не видит команду NewItemCommand.Если я использую простую кнопку, она видит это нормально.Кажется, проблема в том, что эта «цепочка» обязательна.Но я знаю, что это возможно, кнопка WPF имеет свойство зависимости Command, к которому вы привязываете свои команды, поэтому не должно быть так сложно создать свой собственный многократно используемый элемент управления, который предоставляет свойство зависимости ICommand.
Есть идеи?
Спасибо
edit: вот решение, все, что мне нужно было сделать, это использовать RelativeSource с FindAncestor.
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
<Button Name="btnNew" Content="New" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:uscActionButtons}, Path=NewCommand, Mode=OneWay}" />
<Button Name="btnEdit" Content="Edit" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:uscActionButtons}, Path=EditCommand, Mode=OneWay}" />
<Button Name="btnDelete" Content="Delete" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:uscActionButtons}, Path=DeleteCommand, Mode=OneWay}" />
</StackPanel>