如何绑定UWP的ItemsControl中的click事件?
我想做一个汉堡包,这是XAML如何绑定UWP的ItemsControl中的click事件?,uwp,uwp-xaml,Uwp,Uwp Xaml,我想做一个汉堡包,这是XAML <SplitView Grid.Row="1" HorizontalAlignment="Left"> <SplitView.Content> <ListView> <ItemsControl x:Name="NavItemsControl">
<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的建议。此外,我同意您对选择更改的意见。谢谢。