У меня есть приложение 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>