Wpf统一网格项

3

我有一个均匀的网格,里面有按钮和标签。每个按钮都有独特的内容,点击位于方框中的按钮后,我想要更改此框中的标签。但是如何确定点击了哪个框中的按钮以及需要更改哪个标签呢?

namespace WpfApplication107
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new Shop();
    }
}

public class StructOfBox
{
    public string Size { get; set; }
    public string Amount { get; set; }
    public ICommand ChangeSize { get; set; }
}

public class Shop
{
    public Shop()
    {
        Items = new ObservableCollection<StructOfBox>();
        Items.Add(new StructOfBox { Amount = "0", Size = "S", ChangeSize = new RelayCommand(() => ChangeAmount()) });
        Items.Add(new StructOfBox { Amount = "0", Size = "M", ChangeSize = new RelayCommand(() => ChangeAmount()) });
        Items.Add(new StructOfBox { Amount = "0", Size = "L", ChangeSize = new RelayCommand(() => ChangeAmount()) });
        Items.Add(new StructOfBox { Amount = "0", Size = "XL", ChangeSize = new RelayCommand(() => ChangeAmount()) });
    }

    public ObservableCollection<StructOfBox> Items { get; set; }
    public void ChangeAmount()
    {
        // what box?
        Debug.WriteLine("pressed");
    }
}
}

Xaml:

 <Grid>
    <ItemsControl ItemsSource="{Binding Items}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="2" Rows="2"></UniformGrid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border BorderThickness="2" BorderBrush="Green">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>
                        <Button Content="{Binding Size}" Command="{Binding ChangeSize}"></Button>
                        <Label Content="{Binding Amount}" Height="25" Grid.Row="2"></Label>
                    </Grid>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

请展示XAML文件。 - DeshDeep Singh
只需在“ChangeSize”命令执行处理程序中更改“Amount”属性。请注意,您的StructOfBox类需要实现INotifyPropertyChanged接口以更新UI。 - Clemens
你可以将标签绑定/设置到按钮的标记上。当按钮被按下时,您只需要将事件对象(o)强制转换为按钮,然后将其标记转换为标签即可。 - Steffen Winkler
@SteffenWinkler为什么他们要这样做,当已经有一个带有命令的视图模型存在?你的建议需要向已经具有命令绑定的按钮添加Click处理程序。 - Clemens
@Clemens 抱歉,我以前从未使用过命令。曾经想过 Click 事件处理程序在哪里。 - Steffen Winkler
1个回答

0
我会将“调用”StructOfBox作为参数传递给ChangeAmount()处理程序。这样,您就可以更改标签,而不需要真正知道点击了哪个按钮。
但是正如Clemens所说,为了使其正常工作,StructOfBox必须实现INotifyPropertyChanged。

你不需要将当前的StructOfBox项目传递给命令,因为命令已经是StructOfBox的属性。命令的执行方法应该只是StructOfBox的一个方法,并且通过this获取当前项目。 - Clemens
那其实是有道理的。除非他真的需要将“handler”保留在类外面。 - Samuel Beland-Leblanc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接