.net Silverlight datagrid禁用特定单元格

.net Silverlight datagrid禁用特定单元格,.net,silverlight,validation,datagrid,silverlight-4.0,.net,Silverlight,Validation,Datagrid,Silverlight 4.0,silverlight的DataGrid元素中必须进行验证:如果在组合框中选择了特定值,则必须禁用同一行上的复选框列(DataGridCheckBoxColumn)。但是,从我看到的情况来看,我只能禁用整个列,这是不可接受的 那么,如果我有特定单元格的坐标(行、列),如何禁用该单元格 另外,类似的问题-不适合我。silverlight 4中没有CellEnter和CellLeave事件 答案的一部分可能是: private void DisableCheckboxColumnInRow(Data

silverlight的
DataGrid
元素中必须进行验证:如果在组合框中选择了特定值,则必须禁用同一行上的复选框列(
DataGridCheckBoxColumn
)。但是,从我看到的情况来看,我只能禁用整个列,这是不可接受的

那么,如果我有特定单元格的坐标(行、列),如何禁用该单元格


另外,类似的问题-不适合我。silverlight 4中没有CellEnter和CellLeave事件

答案的一部分可能是:

private void DisableCheckboxColumnInRow(DataGridRow row)
{
    var checkBoxColumn = Datagrid1.Columns[0];
    var checkBoxCell = GetCell(checkBoxColumn, row);
    checkBoxCell.IsEnabled = false;
}

private static DataGridCell GetCell(DataGridColumn column, DataGridRow row)
{
    var cellContent = column.GetCellContent(row);
    return (DataGridCell)cellContent.Parent;
}
但使用MVVM可能有更好的方法:

ViewModel部件:

public class TestItem : INotifyPropertyChanged
{
    private bool _isChecked;
    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            _isChecked = value;
            OnPropertyChanged("IsChecked");
        }
    }

    private bool _canBeChecked;
    public bool CanBeChecked
    {
        get { return _canBeChecked; }
        private set
        {
            _canBeChecked = value;
            OnPropertyChanged("CanBeChecked");
        }
    }

    private string _selectedValue;
    public string SelectedValue
    {
        get { return _selectedValue; }
        set
        {
            _selectedValue = value;
            OnPropertyChanged("SelectedValue");
            // here we do the 'magic':
            CanBeChecked = SelectedValue != "one";
        }
    }

    public IEnumerable<string> PossibleValues
    {
        get
        {
            yield return "one";
            yield return "two";
            yield return "free";
        }
    }

    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}
公共类测试项:INotifyPropertyChanged
{
检查私人住宅;
公共场所被检查
{
获取{return\u已检查;}
设置
{
_isChecked=值;
财产变更(“已检查”);
}
}
私人住宅可以检查;
公共场所可以检查
{
获取{return\u可以检查;}
专用设备
{
_可检查=值;
不动产变更(“可检查”);
}
}
私有字符串\u selectedValue;
公共字符串SelectedValue
{
获取{return\u selectedValue;}
设置
{
_selectedValue=值;
OnPropertyChanged(“SelectedValue”);
//现在我们开始“魔术”:
CanBeChecked=SelectedValue!=“一”;
}
}
公共IEnumberable可能值
{
得到
{
收益率回报率“一”;
收益率回报率“二”;
“免费”收益率;
}
}
#INotifyPropertyChanged的区域实现
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
#端区
}
视图部分:

<Controls:DataGridTemplateColumn>
    <Controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding PossibleValues}" SelectedItem="{Binding SelectedValue,Mode=TwoWay}" />
        </DataTemplate>
    </Controls:DataGridTemplateColumn.CellTemplate>
</Controls:DataGridTemplateColumn>
<Controls:DataGridTemplateColumn>
    <Controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay}" IsEnabled="{Binding CanBeChecked}" />
        </DataTemplate>
    </Controls:DataGridTemplateColumn.CellTemplate>
</Controls:DataGridTemplateColumn>

谢谢,我现在就来看看:)