используя раскадровку, чтобы поднять пользовательскую команду.Ошибка: раскадровка не замораживается - PullRequest
0 голосов
/ 19 января 2012

У меня возникли проблемы с раскадровкой, которая жалуется на то, что ее нельзя заморозить. В 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: Невозможно заморозить раскадровку.

Мой пользовательский интерфейс выглядит так:

http://socialbarrel.com/wp-content/uploads/2011/03/Android-Like-Gesture-Unlock-Screen-Being-Tested-By-Apple-Report.jpg?98c14d

Текущее понимание:

Из прочтения я понимаю, что раскадровки должны быть замораживаемыми для быстрого доступа к потокам, где они не заморожены.

Мой вопрос заключается в том, как сделать привязку таким образом, чтобы она была заблокирована, ИЛИ добиться того, чего я хочу, используя альтернативный подход. Моя основная проблема заключается в том, что я хочу вызвать пользовательскую команду или событие при наведении курсора на элемент списка при захвате жеста.

1 Ответ

1 голос
/ 21 января 2012

Вам не нужен раскадровка. В вашем Multidatatrigger используйте привязку данных OneWayToTarget, чтобы установить свойство в ViewModel. Установщик этого свойства будет вызываться при выполнении условия триггера. В этом установщике вы можете вызвать «this.AddToGesture = true».

...