2013-07-08 38 views
0

我有一個ItemsControl其中我顯示不同的屬性和值,在一側的名稱和在另一側上一個TextBox。 ItemsSource是一個自定義類的對象的集合,具有名稱,值和PropertyType屬性(使用反射屬性信息)DataTrigger類型文本/複選框/

現在我想通過能夠檢測屬性是否爲bool類型例如,這將顯示覆選框而不是文本框。這可能使用DataTrigger嗎?

我得到它半工作使用控件,我根據類型將模板設置爲文本框或複選框,但是當我嘗試「選項卡」到下一個文本框或複選框時,它會將控件文本框/複選框第一,只有經過另一個「標籤」,它集中了包含文本/複選框/ ..

所以,如果有人知道了一個解決方案,那將不勝感激!

+0

,我想表明在控制一個TextBox如果布爾是假的,並在其中一個TextBlock的地方,如果是布爾是真實的我最近也有類似的問題。我把TextBox和TextBlock放在我想要顯示的地方。然後,我將每個的Visible屬性綁定到布爾值。如果您認爲這將是您的sltn,我可以發佈代碼。 – Killingsworth

回答

0

使用的解決方案,您已經擁有並設置Focusable屬性設置爲false上錯誤地獲取標籤焦點的控件。

+0

這正是我正在尋找的東西,我怎麼可能沒有看到那麼簡單的東西。非常感謝! :) – Kryptoxx

0

您可以使用DataTemplate中選擇基於價值屬性類型不同的看法。

查看:

<ItemsControl ItemsSource="{Binding Path=Options}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <DataTemplate.Resources> 
         <DataTemplate DataType="{x:Type System:Boolean}"> 
          <CheckBox IsChecked="{Binding Path=.}"/> 
         </DataTemplate> 
         <DataTemplate DataType="{x:Type System:String}"> 
          <TextBox Text="{Binding Path=.}"/> 
         </DataTemplate> 
        </DataTemplate.Resources> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Name, Mode=OneWay}"/> 
         <ContentControl Content="{Binding Path=Value}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

視圖模型:

public class MainViewModel 
{ 
    public ArrayList Options { get; set; } 

    public MainViewModel() 
    { 
     Options = new ArrayList(); 
     Options.Add(new TextProperty()); 
     Options.Add(new BoolProperty()); 
    } 

} 

public class TextProperty 
{ 
    public string Name { get; set; } 

    public string Value { get; set; } 

    public TextProperty() 
    { 
     Name = "Name"; 
     Value = "Default"; 
    } 
} 

public class BoolProperty 
{ 
    public string Name { get; set; } 

    public bool Value { get; set; } 

    public BoolProperty() 
    { 
     Name = "IsEnabled"; 
     Value = true; 
    } 
}