【问题标题】:Using observablecollection with buttons使用带有按钮的 observablecollection
【发布时间】:2013-05-09 16:06:09
【问题描述】:

我有一个 observablecollection 来创建按钮,问题是这些按钮中的每一个都调用相同的事件处理程序。我正在努力使每个按钮都有自己唯一的 id,以便彼此区分开来。用于创建按钮元素的代码是

public class button
{
    public bool IsEmpty { get; set; } 
    public int ID {get; set;}

    public button(int button_Number)
    {
        IsEmpty = true;
        ID = button_Number;

    }
}

I 被添加到以下代码中的 observablecollection 中

        ButtonCollection = new ObservableCollection<cChipVM>();

        for ( int i = 0 ; i < iNumChips ; ++i )
        {
            ButtonCollection.Add( new button(i) );

        }

按钮的xml如下

 <DataTemplate x:Key="ButtonTemplate">
        <Button x:Name="Button" Uid="{Binding Path=ID}" Click="Button_Click" BorderBrush="Black" BorderThickness="1" Margin="7" Width="25" Height="25" ClickMode="Press" Opacity="0.9" Focusable="False" IsHitTestVisible="True" AllowDrop="True" IsTabStop="False">
            <Button.Style>                    
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsEmpty}" Value="false">
                            <Setter Property="Button.Background">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#FF5ED426" Offset="0"/>
                                        <GradientStop Color="White" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=IsEmpty}" Value="true">
                            <Setter Property="Button.Background">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#FF1766F0" Offset="0"/>
                                        <GradientStop Color="White" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>

                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </DataTemplate>

当它尝试使用此方法设置 Uid 时系统崩溃,任何建议如何解决此问题或任何其他解决方案,每个按钮可以有唯一的 ID

【问题讨论】:

    标签: c# button observablecollection


    【解决方案1】:

    您可以使用 Button.Tag 属性来存储 ID 并在处理程序中检查 Tag 的值

    <Button Tag="{Binding Path=ID}" Click="Button_Click" BorderBrush="Black" BorderThickness="1" Margin="7" Width="25" Height="25" ClickMode="Press" Opacity="0.9" Focusable="False" IsHitTestVisible="True" AllowDrop="True" IsTabStop="False">
    

    更新:按钮点击处理程序

    public void Button_Click(object sender,EventArgs e)
    { 
          var myButton = (Button)sender;
          int id = Convert.ToInt32(myButton.Tag);
    }
    

    【讨论】:

    • 所以我尝试了这个,但似乎即使在设置 ID 后,标签值仍为 NULL
    • 很难说为什么。这应该有效。事实上,您的整个数据对象应该在 Button.DataContext 属性中。也许你应该在事件处理程序内部检查 button.DataContext 的值是什么
    • 抱歉我有点糊涂了,我现在正在做的是private void Button_Click(object sender, EventArgs e) { var myButton = Convert.ToInt32(this.Tag); }
    • 错了 :) 你需要 var myButton = (Button) sender;您的按钮位于事件处理程序方法的“发送者”参数中。 “this”是对声明事件处理程序方法的窗口或用户控件的引用。
    • @yawnobleix Therw 是您在答案编辑中的点击处理程序。您应该实施一些额外的错误检查,例如。如果 Tag 不包含 int 数字,则 Convert.ToInt32 可能会失败。
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多