При выборе из списка появляется ошибка «Невозможно анимировать неизменяемый объект» - PullRequest
1 голос
/ 19 января 2011

У меня есть приложение WPF 4. Он содержит 2 списка.

Первый имеет список доступных совпадений. когда совпадение выбрано, выбор используется как DataContext для сетки сведений, отображающей детали совпадения. Дополнительно воспроизводится раскадровка, и появляется 2-й список, отображающий доступные рынки.

Это все отлично работает.

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

InvalidOperationException было необработанный

Невозможно оживить '(0). (1)' в экземпляр неизменяемого объекта

Я не знаю, почему это происходит, поскольку список рынков не пытается воспроизвести анимацию. Может ли это мешать выбору из списка матчей? Я попытался сбросить текст данных datacontext, когда выбор сделан в MarketsList, но это не сработало.

Вот xaml для двух списков

       <StackPanel x:Name="Connected" Grid.Column="1" Grid.Row="1" Visibility="Collapsed">
            <ListBox x:Name="ListBoxMatches" HorizontalAlignment="Left" VerticalAlignment="Center" ItemContainerStyle="{DynamicResource ListBoxItemContainerStyle1}" ItemTemplate="{DynamicResource MatchesDataTemplate}" SelectionChanged="ListBoxMatches_SelectionChanged" />
        </StackPanel>

        <Border x:Name="border1" BorderBrush="White" BorderThickness="1" Grid.Row="1" CornerRadius="20" Padding="15" Margin="-400,0,400,0">
            <StackPanel x:Name="Markets">
                <ListBox x:Name="ListBoxCurrentMarkets" SelectionChanged="ListBoxCurrentMarkets_SelectionChanged" />
            </StackPanel>
        </Border>

Это код для события SelectionChanged для ListBoxMatches:

 private void ListBoxMatches_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (ListBoxMatches.SelectedIndex != -1)
            {
                var selectedMatch = (Match)ListBoxMatches.SelectedItem;
                if (MatchData.DataContext == null)
                {
                    MatchData.DataContext = selectedMatch;
                    Storyboard PlayMatch = (Storyboard)FindResource("MatchSelected");
                    BeginStoryboard(PlayMatch);
                }
                else if (MatchData.DataContext != selectedMatch)
                {
                    MatchData.DataContext = selectedMatch;
                }
            }
        }

Если вам нужен больше код (например, раскадровка xaml), пожалуйста, дайте мне знать.

Если кто-нибудь знает, почему и что происходит, пожалуйста, помогите.

Спасибо

UPDATE

Я внес изменение, рекомендованное Дэниелом, но я, должно быть, сделал что-то не так, потому что оно не работает. Это код, где я установил источник элементов:

 List<Market> TestList = new List<Market>();
                Market market = new Market { ID = 0, MarketName = "CorrectScore" };
                TestList.Add(market);
                market = new Market { ID = 1, MarketName = "Match Odds" };
                TestList.Add(market);                
                ListBoxCurrentMarkets.ItemsSource = TestList;    

Это xaml для списка

<ListBox x:Name="ListBoxCurrentMarkets" SelectionChanged="ListBoxCurrentMarkets_SelectionChanged" ItemContainerStyle="{DynamicResource ListBoxItemContainerStyle1}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <TextBlock x:Name="Market" Foreground="Black" TextWrapping="Wrap" Text="{Binding MarketName, Converter={x:Static local:MyCloneConverter.Instance}}" />
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

и это CloneConverter:

public class MyCloneConverter : IValueConverter
    {
        public static MyCloneConverter Instance = new MyCloneConverter();

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is Freezable)
            {
                value = (value as Freezable).Clone();
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

    }

Пожалуйста, посмотрите и скажите мне, что вы думаете? Я установил точку останова в преобразователе значений, и он не получил удар. Также элементы в списке отображаются, только когда сделан выбор, что происходит ошибка. Спасибо

UPDATE

Это xaml для анимации. Анимация перемещает 2 границы с отрицательным краем в положительное поле (т. Е. С экрана на экран). Есть граница, которая содержит MatchDetails (текстовые блоки, привязанные к данным Match), а рассматриваемая граница - это граница, которая содержит доступные рынки ListBox.

<Storyboard x:Key="MatchSelected">
            <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="borderMatchData">
                <EasingThicknessKeyFrame KeyTime="0" Value="0,-400,0,400"/>
                <EasingThicknessKeyFrame KeyTime="0:0:1" Value="0"/>
            </ThicknessAnimationUsingKeyFrames>
            <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="borderMarkets">
                <EasingThicknessKeyFrame KeyTime="0" Value="-400,0,400,0"/>
                <EasingThicknessKeyFrame KeyTime="0:0:1" Value="0"/>
            </ThicknessAnimationUsingKeyFrames>
        </Storyboard>

Это код для игры в раскадровку из события selectedbreak для MatchesListBox:

MatchData.DataContext = selectedMatch;
                    Storyboard PlayMatch = (Storyboard)FindResource("MatchSelected");
                    BeginStoryboard(PlayMatch);

Это xaml для BorderMArkets:

<Border x:Name="borderMarkets" BorderBrush="White" BorderThickness="1" Grid.Row="1" CornerRadius="20" Padding="15" Margin="-400,0,400,0">
            <StackPanel x:Name="Markets">
                <ListBox x:Name="ListBoxCurrentMarkets" SelectionChanged="ListBoxCurrentMarkets_SelectionChanged" ItemContainerStyle="{DynamicResource ListBoxItemContainerStyle1}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <TextBlock x:Name="Market" Foreground="Black" TextWrapping="Wrap" Text="{Binding MarketName, Converter={StaticResource CloneConverter}}" />
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
        </Border>

UPDATE

Это шаблон, который вызывал все проблемы (я думаю)

<ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true" Background="#FF807F7F">
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal"/>
                    <VisualState x:Name="MouseOver">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd">
                                <EasingColorKeyFrame KeyTime="0" Value="#FF3D3B3B"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Disabled"/>
                </VisualStateGroup>
                <VisualStateGroup x:Name="SelectionStates">
                    <VisualState x:Name="Unselected"/>
                    <VisualState x:Name="Selected">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd">
                                <EasingColorKeyFrame KeyTime="0" Value="#FFA71616"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="SelectedUnfocused">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd">
                                <EasingColorKeyFrame KeyTime="0" Value="#FFA71616"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
                <VisualStateGroup x:Name="FocusStates">
                    <VisualState x:Name="Unfocused"/>
                    <VisualState x:Name="Focused">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd">
                                <EasingColorKeyFrame KeyTime="0" Value="#FF18E526"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsSelected" Value="true">
                <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
            </Trigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="true"/>
                    <Condition Property="Selector.IsSelectionActive" Value="false"/>
                </MultiTrigger.Conditions>
                <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            </MultiTrigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

1 Ответ

3 голосов
/ 19 января 2011

См. http://blogs.msdn.com/b/mikehillberg/archive/2006/09/26/cannotanimateimmutableobjectinstance.aspx

Обычно это происходит, если вы анимируете свойство с привязкой к данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...