【问题标题】:Wpf uniform grid itemWpf统一网格项
【发布时间】:2015-07-31 09:54:18
【问题描述】:

我有统一的网格,带有按钮和标签。每个按钮都有独特的内容,单击位于框中的按钮后,我想更改此框中的标签。但是我如何才能确定单击了哪个框按钮以及需要更改哪个标签?

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 文件
  • 只需更改ChangeSize 命令执行处理程序中的Amount 属性。请注意,您的 StructOfBox 类需要实现 INotifyPropertyChanged 接口来更新 UI。
  • 您可以将标签绑定/设置到按钮的标签。按下按钮时,您只需要将事件对象 (o) 转换为按钮,然后将其标签转换为标签。
  • @SteffenWinkler 为什么他们应该在已经有一个带有命令的视图模型时这样做?您的建议需要将 Click 处理程序添加到已经具有命令绑定的 Button。
  • @Clemens 抱歉,但我以前从未使用过命令。已经想知道 Click 事件处理程序在哪里。

标签: c# wpf


【解决方案1】:

我会将“调用”StructOfBox 作为参数传递给 ChangeAmount() 处理程序。这样您就可以更改标签,而无需知道单击了哪个按钮。

但正如 Clemens 所说,为了使其正常工作,StructOfBox 必须实现 INotifyPropertyChanged。

【讨论】:

  • 您不需要将当前的 StructOfBox 项传递给命令,因为命令已经是 StructOfBox 的属性。该命令的执行方法应该只是 StructOfBox 的一个方法,因此将通过this 获取当前项。
  • 这实际上是有道理的。除非他真的需要把“处理者”留在课堂之外。
猜你喜欢
  • 2012-06-15
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多