2017-10-17 53 views
0

由於數據網格的列不在數據網格的可視化樹中,我使用綁定代理的這種方法綁定DataGridTextColumn的可見性。Datagridcolumn:通過BindingProxy綁定可見性和寬度顯示不同的行爲

https://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

出於某種原因,我想明白同樣的方法做工作的優良Visibility而不是列的Width財產。 有人可以向我解釋這種不同的行爲嗎?

代碼示例

C#

class BindingProxy : Freezable 
{ 
    #region Override of Freezable 
    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 
    #endregion //Override of Freezable 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 


public class Column : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected internal void OnPropertyChanged(string propertyname) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); 
    } 

    public Column(bool visible = true) 
    { 
     if (visible == true) 
      Visible = Visibility.Visible; 
     else 
      Visible = Visibility.Collapsed; 

     Width = 200; 
    } 

    public Visibility Visible 
    { 
     get { return m_visible; } 
     set { m_visible = value; OnPropertyChanged("Visible"); } 
    } 
    Visibility m_visible; 

    public double Width 
    { 
     get { return m_width; } 
     set { m_width = value; OnPropertyChanged("Width"); } 
    } 

    double m_width; 
} 

只是爲了更容易地重現

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 


     Lines = new ObservableCollection<tableline>(); 


     for (int i = 0; i< 5; i++) 
      Lines.Add(new tableline()); 

     Columns = new List<Column>(); 
     Columns.Add(new Column(true)); 
     Columns.Add(new Column(false)); 

     InitializeComponent(); 
     DataContext = this; 
    } 

    public List<Column> Columns { get; set; } 
    public ObservableCollection<tableline>Lines { get; set; } 
} 

public class tableline 
{ 
    public tableline() 
    { 
     Result = new List<string>(); 
     int colCount = 2; 
     for (int i = 0; i < colCount; i++) 
     { 
      Result.Add(i.ToString() + " some text"); 
     } 

    } 
    public List<string> Result { get; set; } 
} 

XAML

<DataGrid ItemsSource="{Binding Lines}" AutoGenerateColumns="False" > 
    <DataGrid.Resources> 
     <local:BindingProxy x:Key="proxy" Data="{Binding}"/> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ProductId1" Binding="{Binding Path=Result[0]}" Visibility="{Binding Data.Columns[0].Visible, Source={StaticResource proxy}}" Width="{Binding Data.Columns[0].Width, Source={StaticResource proxy}}" /> 
     <DataGridTextColumn Header="ProductId2" Binding="{Binding Path=Result[1]}" Visibility="{Binding Data.Columns[1].Visible, Source={StaticResource proxy}}" Width="{Binding Data.Columns[1].Width, Source={StaticResource proxy}}"/> 
    </DataGrid.Columns> 
</DataGrid> 

只是爲了讓你知道我最初的目標是什麼。我想爲所有列設置寬度爲自動,但在繪製數據網格時列寬最大。但是,用戶應該可以調整此限制。這就是爲什麼我不能使用MaxColumnWidth所以我認爲最簡單的方法來實現這一點將是讀取每列的寬度,並將其設置爲「最大」值,如果它大於限制。

回答

1

DataGridColumnWidth財產的類型是DataGridLength而不是double。源物業

變更類型:

public DataGridLength Width 
{ 
    get { return m_width; } 
    set { m_width = value; OnPropertyChanged("Width"); } 
} 

DataGridLength m_width; 

而且BindingMode

<DataGridTextColumn Header="ProductId1" Binding="{Binding Path=Result[1]}" 
        Visibility="{Binding Data.Columns[0].Visible, Source={StaticResource proxy}}" 
        Width="{Binding Data.Columns[0].Width, Source={StaticResource proxy}, Mode=TwoWay}" /> 
+0

完美的作品。非常感謝。你也可以在這裏添加這個答案嗎?似乎是相同的問題https://stackoverflow.com/a/42832215/5381620。我可能不會在那裏添加評論:-) – pedrito

相關問題