【问题标题】:UWP clicking button within a listview列表视图中的 UWP 单击按钮
【发布时间】:2018-07-18 19:09:07
【问题描述】:

我正在尝试在 UWP 中做一些基本的 UI 和绑定以使我的头脑清醒,但我无法访问列表视图项中的按钮。

我有一个按钮,点击它时,它会创建一个新对象,该对象将添加到我的 ObservableCollection 中,然后最终在我的 ListView 中添加一个新项目

XMAL

    <ListView Grid.Row="1" ItemsSource="{x:Bind counts}" x:Name="buttonsView" Margin="5,0" Background="White" Foreground="#FF5059AB">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:Counter">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{x:Bind CountValue, Mode=TwoWay}" FontWeight="Black"/>
                    <Button Click="Increment_Click"  Content="Increment"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

C#

public class Counter
{
    private int count;

    public Counter()
    {
        count = 0;
    }

    public int CountValue
    {
        get
        {
            return count;
        }
        set
        {
            count = value;
        }
    }
}

public sealed partial class MainPage : Page
{
    ObservableCollection<Counter> counts = new ObservableCollection<Counter>();

    public MainPage()
    {
        this.InitializeComponent();
    }

    private void Increment_Click(object sender, RoutedEventArgs e)
    {
         // ?
    }

    private void AddCounter_Click(object sender, RoutedEventArgs e)
    {
        counts.Add(new Counter());
    }
}

这行得通。

但是当我单击 StackPanel 中的按钮时,会调用 Increment_Click 方法,但我不确定此时该做什么。我想通过获取 ListView 项的索引并使用它来索引 ObservableCollection 来访问 Counter 对象。

如何确定添加的 ListView 项的索引是什么?

【问题讨论】:

    标签: c# xaml uwp


    【解决方案1】:

    您应该使用CommandCommandParameter 而不是事件。然后将Command 绑定到在Counter 中实现的命令,并将CommandParameter 绑定到项目(如{Binding})。

    但是,您也可以使用Click 事件以及使用DataContext 来实现您的目标:

    private void Increment_Click(object sender, RoutedEventArgs e)
    {
         var button = (Button)sender;
         var counter = (Counter)button.DataContext;
         //...
    }
    

    除非您另外指定,否则DataContext 基本上默认从父级继承,因此在这种情况下DataContext 是当前列表项。

    【讨论】:

    • 感谢工作。我还实现了绑定命令并使其正常工作。为什么首选这种方法?
    • 它是首选,因为 MVVM 模式提倡将业务逻辑与视图分离。在理想世界中,这意味着视图代码隐藏应该是空的(页面构造函数除外)。当然,这在 100% 的情况下无法实现,但如果您可以选择对项目本身进行命令,那就更好了。另一个优点是您可以随时更改命令实例并执行不同的操作(例如基于项目的当前状态),并且对视图都是透明的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多