在数据网格中以编程方式启用/禁用控制的正确方法是什么?

时间:2010-08-14 01:51:36

标签: silverlight silverlight-4.0

我是银光的新手,所以我不知道这是不是很明显。

我有一个datagrid,其中第一列是一个复选框(名为“Overridden”)。第二列(名为“ShowDetails”)是一个按钮,允许用户展开行以查看嵌套网格。如果未选中“重写”复选框,则应禁用“ShowDetails”按钮。

最初显示时屏幕正确。取消选中初始“重写”复选框时,“ShowDetails”按钮被禁用。当我选中“Overridden”复选框时,“overriddenFlag”会被更改,但是,“ShowDetails”按钮仍然处于禁用状态,而不是更改为“enabled”。

为什么“ShowDetails”按钮的“IsEnabled”标志不会改变?

以下是xaml

中的2列
        <sdk:DataGrid.Columns>

            <sdk:DataGridTemplateColumn Header="Overridden">
              <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <CheckBox IsChecked="{Binding OverriddenFlag,Mode=TwoWay}"
                            Click="Overridden_Click"
                            HorizontalAlignment="Center"
                        />
                </DataTemplate>
              </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>

            <sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                      <Button x:Name="ShowDetails" 
                          FontWeight="bold" FontSize="12"
                          Content="+" Click="ShowDetails_Click" 
                          IsEnabled="{Binding OverriddenFlag, Mode=OneWay}"
                                />
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>

以编程方式启用/禁用数据网格中的按钮的正确方法是什么?

我尝试过在Stack Overflow中看到的各种各样的东西,例如INotifyProperty,一个隐藏按钮的转换器(当我选中复选框时没有显示按钮),我我试图在Overridden_​​Click fct中做一些事情,比如FindName() - 但是没有成功。

1 个答案:

答案 0 :(得分:2)

您遇到的最可能的问题是该行绑定的对象未实现INotifyPropertyChanged。如果没有实现此接口,则您的按钮无法了解复选框对OverriddenFlag属性所做的更改。

这是一个如何完成的例子: -

public class MyClass : INotifyPropertyChanged
{

    private bool _overriddenFlag;
    public bool OverriddenFlag
    {
        get { return _overriddenFlag; }
        set
        {
            _overriddenFlag= value;
            NotifyPropertyChanged("OverriddenFlag");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}