2012-09-26 48 views
0

我有包含2列的數據網格,我想展示一些列#2細胞是:DatagridTemplateColumn與觸發器無法綁定

  1. 組合框
  2. 文本框
基於財產

代碼:

解決方案#1:

<Window.Resources> 
<DataTemplate x:Key="DropDownTemplate"> 
    <StackPanel> 

     <ComboBox SelectedValuePath="Id" DisplayMemberPath="Name" ItemsSource="{Binding MarketConfigurationLOVs, UpdateSourceTrigger=PropertyChanged}"/> 

     </StackPanel> 
</DataTemplate> 

<DataTemplate x:Key="TextBoxTemplate"> 
     <StackPanel> 
      <TextBox Text="{Binding ConfigurationValue, UpdateSourceTrigger=PropertyChanged}" /> 


     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

這裏DataGrid的標籤:

<DataGrid ItemsSource="{Binding Path= MarketConfigurationValues,Mode=TwoWay}" HeadersVisibility="None" AutoGenerateColumns="False" CanUserAddRows="False"> 
    <DataGrid.Columns> 
      <DataGridTextColumn Width="120" Binding="{Binding Path= ConfigurationName}" /> 


      <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
           <ContentControl Content="{Binding}" > 
            <ContentControl.Style> 
              <Style TargetType="ContentControl"> 
               <Style.Triggers> 

                <DataTrigger Binding="{Binding HasLOV}" Value="true"> 
                 <Setter Property="ContentTemplate" Value="{StaticResource DropDownTemplate}" /> 
                </DataTrigger> 
                <DataTrigger Binding="{Binding HasLOV}" Value="false"> 
                 <Setter Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" /> 
                  </DataTrigger> 
                  <!-- and so on --> 
                 </Style.Triggers> 
                </Style> 
               </ContentControl.Style> 
              </ContentControl> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
           </DataGridTemplateColumn> 

    </DataGrid.Columns> 

這未能顯示出實際價值,因爲它顯示的屬性名稱,並始終在下拉列表,當顯示單元我將TextBoxContentTemplate與ComboBoxContentTemplate進行了交換,它將所有單元格顯示爲textBox,因此它似乎忽略了該觸發器,但是當我調試時,我發現HasLOV中的一些項目包含true並且一些包含false

解決方案2:(也沒有)參考:從以下後WPF MVVM Creating Dynamic controls

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <ContentControl x:Name="MyContentControl" Content="{Binding}" /> 

     <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding HasLOV}" Value="false"> 
        <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" /> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding HasLOV}" Value="true"> 
        <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource DropDownTemplate}" /> 
       </DataTrigger> 

     </DataTemplate.Triggers> 

     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

視圖模型喬恩的解決方案是大課,但我在這裏拉與我的問題的主要部分。在構造函數中,我創建了MarketConfigurationValue的列表,並且在MarketConfigurationLOVs中填充了值,以防如果我設置HasLov = true並且我在configurationValue中填充了值(如果我設置了HasLov = false並且運行該應用程序並在調試模式下),我發現主對象列表包含了我正確的說,但失敗了的情況下,顯示組合框HasLov =真和文本框的情況下,HasLov =假:

public class MarketConfigurationValue 
    { 
     public string ConfigurationName { get; set; } 
     public string ConfigurationValue { get; set; } 
     public int ConfigurationValueId { get; set; } 
     public List<Market_Config_Lov> MarketConfigurationLOVs {get;set;} 
     public bool HasLov { get; set; } 

    } 

public class Market_Config_Lov 
    { 
     public virtual string Name { get; set; } 
     public virtual int Sequence { get; set; } 
    } 

能否請你幫忙嗎?

+0

嘗試在ContentControl中通過DataContext = {Binding}替換Content = {Binding}。 –

+0

嘗試在DataTemplate.Triggers下放置觸發器。也許這可以幫助:http://www.codeproject.com/Articles/18303/A-Guided-Tour-of-WPF-Part-4-Data-templates-and-tri – Per

+0

@Florian GI:當我將Content = {綁定}與DataContext = {綁定}是:文本框始終是空的,沒有下拉 –

回答

0

下面介紹如何實現INotifyPropertyChanged接口。在調用HasLOV的setter時,綁定會自動更新。

public class MarketConfigurationValue:INotifyPropertyChanged 
{ 
    private bool _hasLOV; 
    public bool HasLOV 
    { 
     get {return _hasLOV;} 
     set {_hasLOV = value; OnPropertyChanged("HasLOV");} 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 
} 

希望這會有所幫助。

====>屬性名稱是類名爲HasLov的屬性中的屬性,並在XAML中稱爲HasLOV。

+0

它也失敗了 –

+0

我把這件作品放在一個獨立的項目中,我希望你能檢查它。我可以將它附在這裏,還是直接發給你? –

+0

您可以將其發送到我的電子郵件地址;) –