Проблема привязки данных с данными не обновляется - PullRequest
0 голосов
/ 15 марта 2012

У меня есть таблица данных, к которой мне нужно добавить столбцы в коде, потому что я не знаю, какими будут столбцы до времени выполнения.ResultsGrid - это сетка данных.

ResultsGrid.Columns.Add(new DataGridTextColumn()
            {
                Header = columnName,
                Binding = new Binding("results[" + columnName + "]"),
                CanUserSort = true,
                Visibility = buildingFieldList.Single(x => x.FieldName == columnName).Visibility
            });

buildingFieldList содержит списки всех столбцов, которые будут использоваться.Это ObservableCollection, которая содержит объекты моего пользовательского типа DBField.Я удалил ненужные вещи и вставил следующий класс:

public class DBField : INotifyPropertyChanged
{
private bool _Enabled;
private Visibility _Visibility;

public bool Enabled 
{
    get { return _Enabled; }
    set
    {
        _Enabled = value;

        if (_Enabled)
            _Visibility = System.Windows.Visibility.Visible;
        else
            _Visibility = System.Windows.Visibility.Collapsed;

        OnPropertyChanged("Visibility");
        OnPropertyChanged("Enabled");
    }
}

public Visibility Visibility
{
    get { return _Visibility; }
    set
    {
        _Visibility = value;

        if (_Visibility == System.Windows.Visibility.Visible)
            _Enabled = true;
        else
            _Enabled = false;

        OnPropertyChanged("Enabled");
        OnPropertyChanged("Visibility");
    }
}

public event PropertyChangedEventHandler PropertyChanged;


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

У меня есть флажок, который при щелчке изменяет свойство enabled и, таким образом, также изменяет _Visibility и вызывает OnPropertyChanged.Что я ожидаю, так это то, что колонка видимости свернута.Тем не менее, это не меняется.Есть идеи почему?

Ответы [ 3 ]

0 голосов
/ 15 марта 2012

Если вы хотите, чтобы DataGridTextColumn Visibility обновлялся при изменении DBField.Visibility, вам придется использовать привязку:

Binding binding = new Binding("Visibility");
binding.Source = buildingFieldList.Single(x => x.FieldName == columnName);

DataGridTextColumn column = 
    new DataGridTextColumn()    
    {    
        Header = columnName,    
        Binding = new Binding("results[" + columnName + "]"),    
        CanUserSort = true,    
    };

BindingOperations.SetBinding(column, DataGridColumn.VisibilityProperty, binding);

И, возможно, будет хорошей идеей удалить DBField.Visibility целиком и вместо этого привязать непосредственно к свойству Enabled и использовать BooleanToVisibilityConverter :

Binding binding = new Binding("Enabled");
binding.Source = buildingFieldList.Single(x => x.FieldName == columnName);
binding.Converter = new BooleanToVisibiltyConverter();
0 голосов
/ 15 марта 2012

Эта проблема была немного сложнее, чем я думал.Клеменс шел по правильному пути для меня, но я не видел, чтобы у серебряного света было DataGridColumn.VisibilityProperty.Я обнаружил, что у других были проблемы, потому что это свойство не было выставлено также.Чтобы обойти это, они выдвинулись из колонны и сделали свой собственный класс.Я также сделал следующее:

public class ExtendedDataGridTextColumn : DataGridTextColumn
{
public ExtendedDataGridTextColumn() : base() { }

public Visibility ColumnVisibility
{
    get { return (Visibility)GetValue(ColumnVisibilityProperty); }
    set { SetValue(ColumnVisibilityProperty, value); }
}

public static readonly DependencyProperty ColumnVisibilityProperty =
    DependencyProperty.Register(
    "ColumnVisibility",
    typeof(Visibility),
    typeof(ExtendedDataGridTextColumn),
    new PropertyMetadata(ColumnVisibilityChanged));

private static void ColumnVisibilityChanged(object sender, DependencyPropertyChangedEventArgs args)
{
    ExtendedDataGridTextColumn column = sender as ExtendedDataGridTextColumn;
    if (args.NewValue != args.OldValue)
    {
        column.Visibility = (Visibility)args.NewValue;
    }
}
}

Затем я добавил эти пользовательские столбцы в свою сетку данных:

Binding testBind = new Binding();
testBind.Mode = BindingMode.TwoWay;
testBind.Source = buildingFieldList.Single(x => x.FieldName == columnName);
testBind.Path = new PropertyPath("Visibility");

ExtendedDataGridTextColumn temp = new ExtendedDataGridTextColumn()
    {
    Header = columnName,
    Binding = new Binding("results[" + columnName + "]"),
    CanUserSort = true
    };

BindingOperations.SetBinding(temp, ExtendedDataGridTextColumn.ColumnVisibilityProperty, testBind);

ResultsGrid.Columns.Add(temp);

Спасибо Клеменсу за помощь.Я надеюсь, что это поможет и другим.

0 голосов
/ 15 марта 2012

Для свойства столбца в столбце установлено статическое значение, а не привязка.

Visibility = buildingFieldList.Single(x => x.FieldName == columnName).Visibility

Вам необходимо привязать свойство Visibility к свойству видимости вашего объекта.

...