2016-02-01 29 views
1

我有一個WPF數據網格綁定到使用MVVM的數據表。這個數據表中有幾列,其中一個是可爲空的布爾值。在DataGrid呈現,布爾列(主要包含空值)示出了填塊複選框,看起來可怕:綁定到一列數據網格並應用樣式

電流:Nullable text box column期望:Hidden check boxes

我想樣式添加到該列隱藏所有複選框,如果值爲空。 此問題與apply a template to a column of datagrid類似,但由於綁定數據表中的列的數量和位置可能發生更改,因此我無法手動定義XAML中的每一列。

我的數據表在所述視圖模型定義爲:

public DataTable Data 
    { 
     get { return data; } 
     set 
     { 
      data = value; 
      OnPropertyChanged("Data"); 
     } 
    } 

和在類的構造通過調用SQL存儲過程返回DataTable被設置。這個存儲過程可能因用途不同而不同,因此會在不同的時間生成不同的數據表。

目前,我有這樣的代碼:

  <DataGrid ItemsSource="{Binding Data, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"> 
       <DataGrid.Columns> 
        <DataGridCheckBoxColumn Binding="{Binding Paid}" Header="Paid?"> 
         <DataGridCheckBoxColumn.ElementStyle> 
          <Style TargetType="CheckBox"> 
           <Style.Triggers> 
            <Trigger Property="IsChecked" Value="{x:Null}"> 
             <Setter Property="Visibility" Value="Hidden"/> 
            </Trigger> 
           </Style.Triggers> 
          </Style> 
         </DataGridCheckBoxColumn.ElementStyle> 
        </DataGridCheckBoxColumn> 
       </DataGrid.Columns> 
      </DataGrid> 

但是,添加該代碼已經從我的DataGrid列: Headers before change

,並簡單地添加了一個新的複選框列到網格的開始: Headers after change

新添加的列不顯示所需的複選框效果(僅顯示具有值的複選框),但原始的「付費」列未觸及。

有人請讓我知道如何將我的風格綁定到這一列嗎?

+0

是'AutoGenerateColumns'設置爲true DataGrid中?如果沒有,你可以請你發佈所有'DataGrid.Columns'定義? – toadflakz

+0

這是我的整個數據網格定義。沒有其他datagrid.columns定義,因爲網格從itemsource'Data'中取得它(我將在視圖模型中包含該表的定義 - 這只是一個SQL調用),AutoGenerateColumns未設置,我相信這意味着它默認爲假? –

+1

'AutoGenerateColumns'默認爲'true'。 – toadflakz

回答

1

您現在有AutoGenerateColumns設置爲true,這意味着DataGrid將首先使用您的自定義欄定義,然後附加它自己定義爲DataGrid這就是爲什麼你得到的第一個「付費?」列,然後是自動生成的列的其餘部分。

要獲得所需的佈局,您可以將AutoGenerateColumns設置爲false並提供所有列的定義。

否則,請嘗試爲DataGrid分配本地資源以使用您的自定義ElementStyle對所有DataGridCheckBoxColumns進行樣式設置。另外請注意,您可以簡單地將列上的IsThreeState屬性設置爲false,並且應該停止顯示{x:Null}狀態。

更新:

展望深入到這一點,有可能是在造型與DataGridCheckBoxColumn一套AutoGenerateColumnstrue的問題。您將需要處理AutoGeneratingColumn事件並在處理程序中設置ElementStyle

類似:

void grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if(e.Column is DataGridCheckBoxColumn) 
    { 
     var checkBoxColumn = e.Column as DataGridCheckBoxColumn; 
     var resource =  Application.Current.FindResource(typeof(CheckBox)); 
     checkBoxColumn.ElementStyle = resource as Style; 
    } 
} 

來源:http://www.jonathanantoine.com/2011/09/06/wpfs-datagridcheckboxcolumn-elementstyle-uses-a-wrong-default-value/

+0

不幸的是,這不適用於我,因爲我無法手動提供每列的定義。我想我會需要AutoGenerateColumns保持真實,以便可以從數據庫中拾取列。 –

+0

請檢查更新編輯 - 所做的假設是,此網格中的所有DataGridCheckBoxColumns都需要顯示此行爲(無第三個狀態)。 – toadflakz

+0

本地資源可能會工作 - 我會嘗試一下,可悲的是我已經嘗試將IsThreeState設置爲false,並且它沒有任何作用。我會看看我能用本地資源做些什麼。謝謝 –