как связать видимость DataGridTextColumn - PullRequest
1 голос
/ 03 ноября 2011

Я пытаюсь связать видимость сетки данных, как предложил GreatTall1 в своем посте из этой темы

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace XYZ.Controls
{
public class ExtendedDataGridTextColumn : DataGridTextColumn
{
private readonly Notifier _e;
private Binding _visibilityBinding;
public Binding VisibilityBinding
{
    get { return _visibilityBinding; }
    set
    {
        _visibilityBinding = value;
        _e.SetBinding(Notifier.MyVisibilityProperty, _visibilityBinding);
    }
}
public ExtendedDataGridTextColumn()
{
    _e = new Notifier();
    _e.PropertyChanged += ToggleVisibility;
}

private void ToggleVisibility(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Visibility")
        this.Visibility = _e.MyVisibility;
}

//Notifier class is just used to pass the property changed event back to the column   container Dependency Object, leaving it as a private inner class for now
private class Notifier : FrameworkElement, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Visibility MyVisibility
    {
        get { return (Visibility)GetValue(MyVisibilityProperty); }
        private set { SetValue(MyVisibilityProperty, value); }
    }

    public static readonly DependencyProperty MyVisibilityProperty = DependencyProperty.Register("MyVisibility", typeof(Visibility), typeof(Notifier), new PropertyMetadata(MyVisibilityChanged));

    private static void MyVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var n = d as Notifier;
        if (n != null)
        {
           // n.MyVisibility = (Visibility) e.NewValue;
            n.PropertyChanged(n, new PropertyChangedEventArgs("Visibility"));
        }
    }
}

}

Я добавил класс в свойи попытайтесь связать видимость DataGridTextColumn с моим свойством IdVisibility

<sdk:DataGrid x:Name="dgResult" Grid.Row="0" VerticalAlignment="Stretch" SelectionMode="Single" HorizontalAlignment="Stretch" AutoGenerateColumns="False" ItemsSource="{Binding IdSearchList}" IsReadOnly="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Margin="10" Visibility="{Binding IsResultVisible}">

<extDg:ExtendedDataGridTextColumn Binding="{Binding Id}" VisibilityBinding="{Binding IdVisibility}"  Header="Asset ID" Width="50"/>



    private Visibility idVisibility = Visibility.Collapsed;

    public Visibility IdVisibility
    {
        get { return idVisibility; }
        set { idVisibility = value; NotifyPropertyChanged("IdVisibility"); }
    }

Столбец всегда отображается независимо от значения IdVisibility.

Пожалуйста, кто-то может указать, кто яделать неправильно?Это приложение SL4

Спасибо

1 Ответ

0 голосов
/ 29 января 2013

Я думаю, вы должны использовать конвертер Visiblity. Также вы можете связать с этим дизайнером с этим конвертером

Public NotInheritable Class VisibilityConverter
        Implements IValueConverter

        Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert

            If Not targetType Is GetType(Visibility) Then

                Throw New ArgumentOutOfRangeException("targetType", "VisibilityConverter can only convert to Visibility")

            End If

            Dim _visibility As Visibility = Visibility.Visible

            If value Is Nothing Then

                _visibility = Visibility.Collapsed

            End If

            If TypeOf (value) Is Boolean Then

                _visibility = IIf(value, Visibility.Visible, Visibility.Collapsed)

            End If

            If TypeOf (value) Is String Then

                _visibility = IIf(String.IsNullOrEmpty(value), Visibility.Collapsed, Visibility.Visible)

            End If

            Return _visibility

        End Function

        Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack

            Throw New ArgumentOutOfRangeException("targetType", "VisibilityConverter can only convert to Boolean")

        End Function
    End Class
...