Используя раскадровку для поднятия пользовательской команды. Ошибка: раскадровка не замораживается
У меня есть проблемы с раскадровкой, которая жалуется на то, что она не зациклена. В Google есть много ссылок по этому поводу, однако я не уверен, прочитав эту информацию, как я могу добиться того, чего хочу. (т. е. в значительной степени просто выполнить пользовательскую команду из изменения свойства IsMouseOver). Я использую шаблонизацию данных, чтобы изменить мой список, чтобы он выглядел как ссылка, которую я указал в информации ниже:
Мой ресурсный словарь:
<DataSourceProviders:ServiceLocatorProvider ServiceType="{x:Type Interfaces:IGestureBuilderModuleController}" x:Key="GestureController"/>
<Converters:IsGestureBeingBuiltConverter x:Key="IsGestureBeingBuildConverter" />
Мой интерфейс выглядит так:
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsMouseOver}" Value="True" />
<Condition Binding="{Binding Path=CurrentGestureState, Converter={StaticResource IsGestureBeingBuildConverter}}" Value="True" />
</MultiDataTrigger.Conditions>
<!--TODO:Need to add a button to this control. Then use the buttons event to trigger command.-->
<MultiDataTrigger.ExitActions>
<BeginStoryboard>
<StoryBoard:CommandTimeline StoryBoard:CommandStoryboard.Command="{Binding Source={StaticResource ResourceKey=GestureController}, Path=AddToGestureCommand}" />
</BeginStoryboard>
</MultiDataTrigger.ExitActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
Мой конвертер выглядит так:
[ValueConversion(typeof(GestureState), typeof(bool))]
public class IsGestureBeingBuiltConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Equals(value, GestureState.BeingConstructed);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Мой GestureState Enum выглядит так:
public enum GestureState
{
Finished,
BeingConstructed
}
Мой контроллер / команда Жест выглядит так:
public class GestureBuilderModuleController : ModuleController, IGestureBuilderModuleController
{
public ICommand AddToGestureCommand
{
get { return new DelegateCommand<GestureBuilderViewModel>(viewModel => viewModel.AddToGesture = true); }
}
}
Моя модель выглядит так:
public GestureableItemViewModel ItemBeingAdded { get; set; }
public virtual bool AddToGesture
{
get { return false; }
set
{
if (ItemBeingAdded == null) return;
if(CurrentGestureState != GestureState.BeingConstructed) return;
SelectedItems.Add(ItemBeingAdded);
}
}
Исключение, которое я получаю:
InvalidOperation: Невозможно заморозить раскадровку.
Мой интерфейс выглядит так:
Текущее понимание:
Из прочтения я понимаю, что раскадровки должны быть замораживаемыми для быстрого доступа к потокам, где они не заморожены.
Мой вопрос заключается в том, как сделать связывание таким образом, чтобы оно могло быть заморожено ИЛИ достичь того, что я хочу, используя альтернативный подход. Моя основная проблема заключается в том, что я хочу вызвать пользовательскую команду или событие при наведении курсора на элемент списка при захвате жеста.
1 ответ
Вам не нужен раскадровка. В вашем Multidatatrigger используйте привязку данных OneWayToTarget, чтобы установить свойство в вашей модели представления. Установщик этого свойства будет вызываться при выполнении условия триггера. В этом установщике вы можете вызвать "this.AddToGesture = true".