如何绑定UWP的ItemsControl中的click事件?

如何绑定UWP的ItemsControl中的click事件?,uwp,uwp-xaml,Uwp,Uwp Xaml,我想做一个汉堡包,这是XAML <SplitView Grid.Row="1" HorizontalAlignment="Left"> <SplitView.Content> <ListView> <ItemsControl x:Name="NavItemsControl">

我想做一个汉堡包,这是XAML

<SplitView Grid.Row="1" HorizontalAlignment="Left">
                <SplitView.Content>
                    <ListView>
                        <ItemsControl x:Name="NavItemsControl">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel></StackPanel>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Button>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <ColumnDefinition Width="*"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>
                                            <TextBlock FontFamily="Segoe MDL2 Assets" Text="{Binding Icon}"></TextBlock>
                                            <TextBlock Text="{Binding Content}" Grid.Column="1"></TextBlock>
                                        </Grid>
                                    </Button>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </ListView>
                </SplitView.Content>
            </SplitView>
设置NavItemsControl的ItemSource后,我可以轻松绑定图标或内容等属性。唯一的问题是我想绑定的click事件 按了按钮,但我不知道如何绑定。

我尝试使用委托绑定单击事件,但无效并报告错误。

你能帮帮我吗?


谢谢

要为您注册事件按钮,请单击您需要添加并定义ListView的Selection Changed事件。所以你的代码应该是这样的:

<SplitView Grid.Row="1" HorizontalAlignment="Left">
                <SplitView.Content>
                    <ListView x:Name="itemListView" SelectionChanged="ItemListView_SelectionChanged">
                        <ItemsControl x:Name="NavItemsControl">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel></StackPanel>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Button>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <ColumnDefinition Width="*"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>
                                            <TextBlock FontFamily="Segoe MDL2 Assets" Text="{Binding Icon}"></TextBlock>
                                            <TextBlock Text="{Binding Content}" Grid.Column="1"></TextBlock>
                                        </Grid>
                                    </Button>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </ListView>
                </SplitView.Content>
            </SplitView>
private void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
      if(itemListView.SelectedItem!=null){
         Debug.WriteLine(itemListView.SelectedIndex + " Index selected");
         // More logic here 
      }

 }

在讨论您的问题之前,让我们首先修复您的XAML。您正在使用
列表视图
包装
项控件
,这是不必要的。实际上,
ListView
本身继承了
ItemsControl
,基本上是它的一个更强大的版本。在您的情况下,一个
ItemsControl
就足够了,这样您就可以安全地删除
ListView
包装器

由于您在模板中使用了
按钮
,因此可以在
导航项
中创建
单击命令
(类型为
ICommand
),并将
按钮
命令
属性绑定到该按钮

<Button Command="{Binding ClickCommand}" />

互联网上有大量的资源,你可以在那里找到
ICommand
实现,看看它是如何在互联网上实现的


旁注


我个人不喜欢使用
SelectionChanged
,因为这是一个数据驱动的事件,可以由数据更改触发。这可能是不可预测和容易出错的。此外,除非手动重置
SelectedIndex
,否则不能重新选择同一项目。按钮
Click
(或
ListView
中的
ItemClick
)是一种输入驱动的事件,只能(在大多数情况下)由用户操作调用,这很少会给您带来任何副作用。

我试图用ICommand来做,但代码看起来很难看。仅供参考

<SplitView Grid.Row="1" HorizontalAlignment="Left">
                <SplitView.Content>
                    <ItemsControl x:Name="NavItemsControl">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel></StackPanel>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Button Command="{Binding ClickCommand}" Padding="10,20" Background="Transparent">
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="auto"></ColumnDefinition>
                                            <ColumnDefinition Width="*"></ColumnDefinition>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock FontFamily="Segoe MDL2 Assets" Text="{Binding Icon}" VerticalAlignment="Center"></TextBlock>
                                        <TextBlock Text="{Binding Content}" Grid.Column="1" VerticalAlignment="Center" Padding="20,0,0,0"></TextBlock>
                                    </Grid>
                                </Button>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </SplitView.Content>
            </SplitView>

代码隐藏:

public class NavItems : INotifyPropertyChanged
    {
        string _Icon;
        public string Icon
        {
            set
            {
                _Icon = value;
                OnPropertyChanged("Icon");
            }
            get
            {
                return _Icon;
            }
        }
        string _Content;
        public string Content
        {
            set
            {
                _Content = value;
                OnPropertyChanged("Content");

            }
            get
            {
                return _Content;
            }
        }            

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
public MainPage()
        {
            InitializeComponent();
            NavItems.ClickVoidDelegate CD = new NavItems.ClickVoidDelegate(()=> { Debug.WriteLine("123"); });
            List<NavItems> NavItemsList = new List<NavItems>()
            {
                new NavItems(){
                    Icon="\xE166",Content="Open",ClickCommand=new NavItems.ClickCommandClass(CD)
                }
            };

            NavItemsControl.ItemsSource = NavItemsList;
        }
public class NavItems : INotifyPropertyChanged
        {
            string _Icon;
            public string Icon
            {
                set
                {
                    _Icon = value;
                    OnPropertyChanged("Icon");

                }
                get
                {
                    return _Icon;
                }
            }
            string _Content;
            public string Content
            {
                set
                {
                    _Content = value;
                    OnPropertyChanged("Content");

                }
                get
                {
                    return _Content;
                }
            }
            ClickCommandClass _ClickCommand;
            public ClickCommandClass ClickCommand
            {
                get;
                set;
            }
            public class ClickCommandClass : ICommand
            {
                public ClickCommandClass(ClickVoidDelegate ClickVoid)
                {
                    _ClickVoid = ClickVoid;
                }
                ClickVoidDelegate _ClickVoid;
                public void Execute(object parameter)
                {
                    if (_ClickVoid != null)
                    {
                        _ClickVoid();
                    }
                }
                public bool CanExecute(object parameter)
                {
                    return true;
                }
                public event EventHandler CanExecuteChanged;
            }
            public delegate void ClickVoidDelegate();
            protected virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }
public主页()
{
初始化组件();
NavItems.ClickVoidDelegate CD=新的NavItems.ClickVoidDelegate(()=>{Debug.WriteLine(“123”);});
List NavItemsList=新列表()
{
新NavItems(){
Icon=“\xE166”,Content=“Open”,ClickCommand=new-NavItems.ClickCommandClass(CD)
}
};
NavItemsControl.ItemsSource=NavItemsList;
}
公共类导航项:INotifyPropertyChanged
{
字符串图标;
公共字符串图标
{
设置
{
_图标=值;
OnPropertyChanged(“图标”);
}
得到
{
返回图标;
}
}
字符串内容;
公共字符串内容
{
设置
{
_内容=价值;
关于财产变更(“内容”);
}
得到
{
返回内容;
}
}
ClickCommandClass\u ClickCommand;
公共ClickCommand类ClickCommand
{
得到;
设置
}
公共类ClickCommandClass:ICommand
{
公共ClickCommandClass(单击作废委托单击作废)
{
_ClickVoid=ClickVoid;
}
单击作废委托\u单击作废;
public void Execute(对象参数)
{
如果(_ClickVoid!=null)
{
_单击void();
}
}
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件处理程序CanExecuteChanged;
}
公共委托无效单击无效委托();
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
公共事件属性更改事件处理程序属性更改;
}

我是UWP的创始人,非常感谢您对Listview的建议。此外,我同意您对选择更改的意见。谢谢。