Каков наилучший способ реализации функции переименования из контекстного меню в WPF? Что мне нужно, так это функции, такие как проводник Windows, где вы щелкаете правой кнопкой мыши элемент, получаете контекстное меню, и если вы выбираете переименовать, текст становитсяредактируемые.
Пока я пробовал следующее, но я думаю, что должен быть лучший способ.Практически любой аспект этого решения может быть изменен:)
<ListBox Grid.Row="0" MinWidth="200" MinHeight="75" ItemsSource="{Binding Path=DataSetsVM.DataSets, Source={StaticResource vmLocator}}" x:Name="dataSets">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="nameRoot">
<TextBlock x:Name="nameBlock" Text="{Binding Path=Name}" HorizontalAlignment="Stretch" MinWidth="200" Tag="{Binding DataContext, ElementName=dataSets}">
<TextBlock.ContextMenu>
<ContextMenu >
<ContextMenu.Resources>
<Style TargetType="Image">
<Setter Property="Height" Value="24"/>
<Setter Property="Width" Value="24"/>
</Style>
</ContextMenu.Resources>
<MenuItem Header="Rename" x:Name="RenameDatasetContext"
Command="{Binding PlacementTarget.Tag.CoreCommands.RenameDatasetCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.DataContext,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ContextMenu}}}">
<MenuItem.Icon>
<Image Source="{StaticResource RenameLargeIcon}"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
<TextBox x:Name="nameBox" Text="{Binding Path=Name}" HorizontalAlignment="Stretch" MinWidth="200" Visibility="Collapsed" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsEditable}" Value="True">
<Setter TargetName="nameBlock" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="nameBox" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Установщик для Name делает это:
set
{
if (IsEditable)
{
IsEditable = false;
if (_name == value)
{
RaisePropertyChanged(NamePropertyName);
return;
}
// Do some back end stuff
if (back end stuff worked)
{
var oldValue = _name;
_name = value;
RaisePropertyChanged(NamePropertyName);
}
else
{
// Do something about the error in the back end
}
}
}
Все, что делает команда, устанавливает IsEditable в true.
Это работает, если вы на самом деле не изменяете имя, и в этот момент ничто не может вернуть IsEditable, так как никогда не вызывается установщик для Name, так что вы можете получить кучу элементов в режиме Rename.
Могу ли я установить свойство на виртуальной машине через триггер или есть лучший способ сделать это?