2015-11-10 66 views
0

我試圖安裝並綁定ToggleButton以更改DataGrid中列的可見性。 I am following this post問題在於轉換器不會啓動,我不知道爲什麼。WPF DataGridTemplateColumn集具有綁定的可見性未觸發

我的代碼如下:

<DataGridTemplateColumn Header="My Header" 
         Visibility="{Binding IsChecked, 
            ElementName=AdvancedToggleButton, 
            Converter={StaticResource booleanToVisaulConverter}}" > 
<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
       <!-- Elements removed for brevity--> 
     </StackPanel> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 

的轉換器是本

<Page.Resources> 
    <local:BooleanToVisaulConverter x:Key="booleanToVisaulConverter" /> 
</Page.Resources> 

隨着後面的代碼;

public class BooleanToVisaulConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool visibility = (bool)value; 
     return visibility ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Visibility visibility = (Visibility)value; 
     return (visibility == Visibility.Visible); 
    } 
} 

編輯:@Breeze發現booleanToVisaulConverter實際上並沒有指向BooleanToVisaulConverter一個錯誤。這已被修復,但仍未解僱。詢問ToggleButton代碼;

<ToggleButton Name="AdvancedToggleButton" Content="Advanced" /> 
+1

如果錯誤不在於你用BooleanToVisibiltyConverter在靜態的資源,而不是BooleanToVisaulConverter – Breeze

+0

@Breeze固定BooleanToVisaulConverter,見上面 – Xaphann

+0

有已經在框架BooleanToVisibilityConverter,僅供參考,請分享advancedToggleButton的聲明。你應該使用像Snooper這樣的工具來檢查可視化樹在運行時的綁定錯誤。 – Will

回答

0

所以,事實證明,如果你設置可見性的標題和它仍然存在並沒有完全隱藏在列的單元格...一些挖掘(使用了前所未有的:)數據網格)後,我已經發現你從DataGrid對象訪問列,以便工作最快的是:

XAML

<ToggleButton Name="AdvancedToggleButton" 
       Content="Advanced" 
       Click="AdvancedToggleButton_Click" /> 

背後

private void AdvancedToggleButton_Click(object sender, RoutedEventArgs e) 
{ 
    var newVisibility = (bool)(sender as ToggleButton).IsChecked ? 
     Visibility.Visible : Visibility.Collapsed; 
    this.theDataGrid.Columns[0].Visibility = newVisibility; 
} 
代碼

當然,如果你打算在實際代碼中使用它,你必須實現一些邏輯來獲得適當的列,而不是使用固定的索引。

2

幾周前我遇到了同樣的問題。我的解決方案如下:

首先,您必須實現一個綁定代理類來保存您的datacontext。這個類看起來像:

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

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

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 
} 

然後你定義頁面資源創建的實例,此綁定代理,如:

<namespaceOfProxy:BindingProxy Data="{Binding}" x:Key="proxy"/> 

然後你可以綁定你DataGridTemplateColumn到財產的Visiblity你以下代碼的視圖模型:

Visibility="{Binding Source={StaticResource proxy}, Path=Data.IsToggleButtonChecked, Converter={StaticResource booleanToVisaulConverter}}" 

這適用於將可見性綁定到viewmodel中的屬性。在你的情況下,我將綁定的狀態也視圖模型中的屬性。

相關問題