在Windows应用商店应用中通过可视状态更改边距属性(XAML + C#)

时间:2014-06-06 16:49:16

标签: c# xaml winrt-xaml

我有一个对象列表,我在ListView上显示。现在我想根据ViewModel中的值更改ListViewItem的Margin属性。

现在,每当我运行代码时,我都会收到以下错误: - "异常目标sp1未定义任何VisualStateGroups。"

我不知道我做错了什么。任何帮助将受到高度赞赏

请在下面找到我的代码段: -

XAML(请关注扩展和折叠状态): - `

<UserControl.DataContext>
    <vm:BasketUserControlViewModel/>
</UserControl.DataContext>

<UserControl.Resources>

</UserControl.Resources>

<!-- Page content -->
<Grid x:Name="ContentGrid" Width="400" Height="600">
    <ListView 
        x:Name="BasketListView"
        Width="400"
        Height="Auto"
        ItemsSource="{Binding Nodes}" 
        SelectionMode="None"
        IsItemClickEnabled="True">
        <interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="ItemClick">
                <core:InvokeCommandAction Command="{Binding NavigateToChild}"/>
            </core:EventTriggerBehavior>

        </interactivity:Interaction.Behaviors>
        <ListView.HeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Button Content="Back" HorizontalAlignment="Left" Command="{Binding NavigateToParent}" CommandParameter="{Binding Items, ElementName=BasketListView}"/>
                    <Button Content="Expand" HorizontalAlignment="Right" Command="{Binding ExpandBasketEntry}" CommandParameter="{Binding Items, ElementName=BasketListView}">

                    </Button>
                </StackPanel>
            </DataTemplate>
        </ListView.HeaderTemplate>
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel x:Name="sp1" Orientation="Horizontal" Margin="20,0,10,0" Background="Black">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="Test">
                            <VisualState x:Name="Expanded">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Margin" Storyboard.TargetName="sp1">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Level, Converter={StaticResource basketMarginCnverter}}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Collapsed">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames  Storyboard.TargetProperty="Margin" Storyboard.TargetName="sp1">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="0,0,0,0"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <TextBlock Text="{Binding Title}" HorizontalAlignment="Left"/>
                    <Button HorizontalAlignment="Right">
                        <Image Source="ms-appx:///Assets/RightArrow.jpg" Width="10" Height="10"></Image>
                    </Button>

                    <interactivity:Interaction.Behaviors>
                        <core:DataTriggerBehavior Binding="{Binding ElementName=ContentGrid, Path=DataContext.IsExpandedBasket}" Value="True">
                            <core:GoToStateAction  StateName="Expanded"/>
                        </core:DataTriggerBehavior>
                        <core:DataTriggerBehavior Binding="{Binding ElementName=ContentGrid, Path=DataContext.IsExpandedBasket}" Value="False">
                            <core:GoToStateAction  StateName="Collapsed"/>
                        </core:DataTriggerBehavior>
                    </interactivity:Interaction.Behaviors>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

`

ViewModel: -

public class BasketUserControlViewModel : ViewModel
{
    private INavigationService _navigationService;
    private ObservableCollection<BasketEntryModel> _nodes;
    private List<BasketEntryModel> _basketEntryList;

    public ICommand ExpandBasketEntry { get; private set; }
    public ICommand NavigateToChild { get; private set; }
    public ICommand NavigateToParent { get; private set; }

    private bool _isExpandedBasket;

    public bool IsExpandedBasket
    {
        get { return _isExpandedBasket; }
        set 
        {
            base.SetProperty(ref this._isExpandedBasket, value);
        }
    }


    public BasketUserControlViewModel()
    {
        _nodes = new ObservableCollection<BasketEntryModel>();
        _basketEntryList = new List<BasketEntryModel>();

        BasketEntryModel parent1 = new BasketEntryModel();
        parent1.Title = "Parent 1";
        parent1.BasketID = 1;
        parent1.Level = 1;


        List<BasketEntryModel> parent1Childs = new List<BasketEntryModel>();

        BasketEntryModel parent1Child1 = new BasketEntryModel();
        parent1Child1.Title = "Parent 1 Child 1";
        parent1Child1.BasketID = 5;
        parent1Child1.Level = 2;

        BasketEntryModel parent1Child2 = new BasketEntryModel();
        parent1Child2.Title = "Parent 1 Child 2";
        parent1Child2.BasketID = 6;
        parent1Child2.Level = 2;

        BasketEntryModel parent1Child3 = new BasketEntryModel();
        parent1Child3.Title = "Parent 1 Child 3";
        parent1Child3.BasketID = 7;
        parent1Child3.Level = 2;

        BasketEntryModel parent1Child4 = new BasketEntryModel();
        parent1Child4.Title = "Parent 1 Child 4";
        parent1Child4.BasketID = 8;
        parent1Child4.Level = 2;

        parent1Childs.Add(parent1Child1);
        parent1Childs.Add(parent1Child2);
        parent1Childs.Add(parent1Child3);
        parent1Childs.Add(parent1Child4);

        parent1.Childs = parent1Childs;

        List<BasketEntryModel> parent1Child1Childs = new List<BasketEntryModel>();

        BasketEntryModel parent1Child41 = new BasketEntryModel();
        parent1Child41.Title = "Parent 1 Child 41";
        parent1Child41.BasketID = 8;
        parent1Child41.Level = 3;

        BasketEntryModel parent1Child42 = new BasketEntryModel();
        parent1Child42.Title = "Parent 1 Child 42";
        parent1Child42.BasketID = 8;
        parent1Child42.Level = 3;

        BasketEntryModel parent1Child43 = new BasketEntryModel();
        parent1Child43.Title = "Parent 1 Child 43";
        parent1Child43.BasketID = 8;
        parent1Child43.Level = 3;

        BasketEntryModel parent1Child44 = new BasketEntryModel();
        parent1Child44.Title = "Parent 1 Child 44";
        parent1Child44.BasketID = 8;
        parent1Child44.Level = 3;

        BasketEntryModel parent1Child45 = new BasketEntryModel();
        parent1Child45.Title = "Parent 1 Child 45";
        parent1Child45.BasketID = 8;
        parent1Child45.Level = 3;

        parent1Child1Childs.Add(parent1Child41);
        parent1Child1Childs.Add(parent1Child42);
        parent1Child1Childs.Add(parent1Child43);
        parent1Child1Childs.Add(parent1Child44);
        parent1Child1Childs.Add(parent1Child45);

        parent1Child4.Childs = parent1Child1Childs;


        BasketEntryModel parent2 = new BasketEntryModel();
        parent2.Title = "Parent 2";
        parent2.BasketID = 2;
        parent2.Level = 1;

        BasketEntryModel parent3 = new BasketEntryModel();
        parent3.Title = "Parent 3";
        parent3.BasketID = 3;
        parent3.Level = 1;

        BasketEntryModel parent4 = new BasketEntryModel();
        parent4.Title = "Parent 4";
        parent4.BasketID = 4;
        parent4.Level = 1;

        _basketEntryList.Add(parent1);
        _basketEntryList.Add(parent2);
        _basketEntryList.Add(parent3);
        _basketEntryList.Add(parent4);

        _nodes = new ObservableCollection<BasketEntryModel>(_basketEntryList);

        NavigateToChild = new DelegateCommand<object>(GetChildBasketEntryData);
        NavigateToParent = new DelegateCommand<object>(GetParentBasketEntryData);
        ExpandBasketEntry = new DelegateCommand<object>(ExpandBasketEntryData);
    }

    public BasketUserControlViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public ObservableCollection<BasketEntryModel> Nodes
    {
        get
        {
            return _nodes;
        }
        set
        {
            base.SetProperty(ref this._nodes, value);
        }
    }


    private void GetChildBasketEntryData(object parameter)
    {
        try
        {
            var basketEntry = ((ItemClickEventArgs)parameter).ClickedItem as BasketEntryModel;
            Nodes = new ObservableCollection<BasketEntryModel>(basketEntry.Childs);
        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception " + e.Message);
        }
    }

    private void GetParentBasketEntryData(object parameter)
    {
        try
        {
            ItemCollection itemCollection = (ItemCollection)parameter;
            BasketEntryModel basketEntry = (BasketEntryModel)itemCollection.FirstOrDefault();

            if (basketEntry != null)
            {
                List<BasketEntryModel> _flattenList = _basketEntryList.FlatList();
                var previousLevel = basketEntry.Level - 1;
                if (previousLevel != 0)
                {
                    List<BasketEntryModel> _parentList = (from o in _flattenList where o.Level == previousLevel select o).ToList();
                    Nodes = new ObservableCollection<BasketEntryModel>(_parentList);
                }
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception " + e.Message);
        }
    }

    private void ExpandBasketEntryData(object parameter)
    {
        try
        {
            ItemCollection itemCollection = (ItemCollection)parameter;
            List<BasketEntryModel> _currentBasketEntries = itemCollection.Cast<BasketEntryModel>().ToList<BasketEntryModel>();

            if (_currentBasketEntries != null && _currentBasketEntries.Count > 0)
            {
                List<BasketEntryModel> _flattenList = _currentBasketEntries.FlatList();
                if (_flattenList != null && _flattenList.Count > 0)
                {
                    Nodes = new ObservableCollection<BasketEntryModel>(_flattenList);
                    IsExpandedBasket = true;
                }
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception " + e.Message);
        }
    }

}

感谢和问候, 萨姆

0 个答案:

没有答案