WPF DataGrid-DataGridCheckBoxColumn vs2010 c # .net - PullRequest
0 голосов
/ 03 июля 2011

Я работаю в vs2010.Я создал DataGrid, который ограничен списком ObservableCollection;

Class_CMD выглядит следующим образом:

 public class Class_RetrieveCommand
{
    public string CMD { get; set; }
    public bool C_R_CMD { get; set; }
    public bool S_CMD { get; set; }
    public bool C_S_CMD { get; set; }
}

У меня есть 4 делегата, которые я передаю в другое окно, и это окно необходимо обновитьсписок во время выполнения.Во время выполнения я вижу, что столбец строки сетки обновляется все время, но DataGridCheckBoxColumns никогда не обновляются.

DataGrid -

<DataGrid Background="Transparent" x:Name="DataGrid_CMD" Width="450" MaxHeight="450" Height="Auto" ItemsSource="{Binding}" AutoGenerateColumns="True">

один из делегатов, который обновляет bool,-

 public void UpdateC_S_CMD(string Msg)
    {
        foreach (Class_CMD c in List.ToArray())
        {
            if (c.CMD.Equals(Msg))
                c.C_S_CMD = true;
        }
    }

Я не понимаю, почему столбцы bool не обновляются .... Кто-нибудь может помочь, пожалуйста?спасибо.

Ответы [ 2 ]

2 голосов
/ 03 июля 2011

Вашему классу Class_RetrieveCommand необходимо реализовать интерфейс INotifyPropertyChanged.В противном случае отдельные строки, привязанные к экземплярам класса, не будут знать, что базовые свойства изменились.Если вы измените его на что-то вроде этого, вы должны увидеть изменения, отраженные в вашей сетке:

public class Class_RetrieveCommand : INotifyPropertyChanged
{
    private bool _cRCmd;
    private bool _cSCmd;
    private string _cmd;
    private bool _sCmd;

    public string CMD
    {
        get { return _cmd; }
        set
        {
            _cmd = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("CMD"));
        }
    }

    public bool C_R_CMD
    {
        get { return _cRCmd; }
        set
        {
            _cRCmd = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("C_R_CMD"));
        }
    }

    public bool S_CMD
    {
        get { return _sCmd; }
        set
        {
            _sCmd = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("S_CMD"));
        }
    }

    public bool C_S_CMD
    {
        get { return _cSCmd; }
        set
        {
            _cSCmd = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("C_S_CMD"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }
}
1 голос
/ 03 июля 2011

Вы должны реализовать INotifyPropertyChanged в Class_RetrieveCommand следующим образом:

public class Class_RetrieveCommand : INotifyPropertyChanged
{
    private string _CMD;
    public string CMD 
    {
        get { return _CMD; } 
        set { _CMD = value; OnPropertyChanged("CMD"); }
    }

    ... similar for the other properties

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

К сожалению, вы больше не можете использовать свойства авто (за исключением тех случаев, когда вы используете прокси-генераторы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...