2012-05-01 39 views
3

我有一個ComboBox,它構成了一個DataTemplate,我無法將其IsEnabled屬性綁定到模板DataGridTemplateColumn上的IsReadOnly屬性。使用DataTemplate中應用的樣式綁定到DataGridTemplateColumn?

我已經收到以下錯誤在我的VS輸出窗口:

在 '對象' '' ContentPresenter」

組合框風格沒有找到'IsReadOnly' 屬性:

<Style TargetType="{x:Type ComboBox}" x:Key="ProficiencyColumnComboBoxStyle"> 
    <Setter Property="IsEnabled" 
     Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, 
     Path=IsReadOnly, Converter={StaticResource BooleanOppositeConverter}}" /> 
</Style> 

我認爲問題出在我如何指定fy RelativeSource旨在識別我的DataGridColumn。我已經試過:

  • RelativeSource={RelativeSource TemplatedParent}

  • RelativeSource AncestorType={x:Type DataGridColumn}

  • RelativeSource AncestorType={x:Type DataGridTemplateColumn}

我嘗試添加其他制定者這種風格,和他們做才能生效,所以我知道風格和DataTemplate正在應用於控件。

P.S.

我用同樣的方法將另一ComboBox一個DataTemplate內綁定到一個屬性對父模板其列DataGrid區別在於我在這裏使用的是轉換器,並試圖綁定到列(而不是網格)上的屬性。但是,即使我從上述樣式中刪除轉換器,也不會發生綁定。

+1

不能像這樣綁定到列,它們不是邏輯或可視樹中的對象,它們只是數據,因此RelativeSource將失敗。你應該[調試綁定](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx) ,當然你會得到一個綁定錯誤。 –

+0

@ H.B。這是一篇優秀的文章,爲您提供支持!在我的輸出窗口中發現的綁定錯誤出現在問題中......如果您知道解決方法或替代方法來實現我的目標,請發佈答案,我很樂意接受。 – Rob

+1

這是你爲TemplatedParent得到的錯誤,我假設,對於綁定到列,你應該得到一些關於源未找到的東西。無論如何,通常你只能使用'Binding.Source'結合['x:Reference'](http://msdn.microsoft.com/en-us/library/ee795380.aspx)綁定到DG列,是週期性依賴的併發症。 –

回答

3

試試這個:

<Style TargetType="{x:Type ComboBox}" x:Key="ProficiencyColumnComboBoxStyle"> 
    <Setter Property="IsEnabled" 
      Value="{Binding IsReadOnly, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Converter={StaticResource BooleanOppositeConverter}}"/> 
</Style> 

DataGridCell.IsReadOnly應該從DataGridColumn.IsReadOnly拿起值。

1

將列創建爲資源可能會生效,這樣您可以使用StaticResource來定位它。例如

<DataGrid.Resources> 
    <DataGridTemplateColumn x:Key="Column" .../> 
</DataGrid.Resources> 
<DataGrid.Columns> 
    <StaticResource ResourceKey="Column"/> 
</DataGrid.Columns> 
{Binding IsReadOnly, Source={StaticResource Column}} 

經由列的名稱在評論Binding.Sourcex:Reference提到的可能以及工作,根據不同的結構。如果可以將帶有引用的零件移動到被引用元素的資源中,通常可以擺脫循環依賴性錯誤。您只需在需要該部件的地方使用StaticResource擴展,不是太方便。

+0

+1的信息答案。抱歉不接受我在評論中提到的內容,但Stipo提供了一個簡明的工作答案,而這種方法需要重新構建我的XAML。將來可能會使用這個:) – Rob

+0

@robjb:這是一個非常有趣的想法,我不得不說,值得接受。 –