2013-07-08 3 views
0

У меня есть ItemControl, в котором отображаются разные свойства и значения с именем на одной стороне и TextBox с другой стороны. Элемент ItemsSource представляет собой набор объектов пользовательского класса, который имеет свойства Name, Value и PropertyType (используя reflections propertyinfo)DataTrigger type to textbox/checkbox/

Теперь я хотел бы улучшить это, обнаружив, имеет ли свойство тип bool, например , на котором будет отображаться флажок вместо текстового поля. Возможно ли использование DataTrigger?

Я получил его полурабочую, используя элемент управления, для которого я установил шаблон в текстовое поле или флажок в соответствии с типом, но когда я пытаюсь «вставить» в следующее текстовое поле или флажок, он фокусирует элемент управления, который имеет сначала поле «textbox /», и только после другой «вкладки» он фокусирует содержащее текстовое поле/флажок /.

Так что если кто-нибудь знает решение для этого, это было бы очень полезно!

+0

У меня была аналогичная проблема в последнее время, когда я хотел показать TextBox в элементе управления, если bool был ложным и TextBlock на своем месте, если этот bool был true. Я помещал как TextBox, так и TextBlock, где я хотел либо показать. Затем я привязываю свойство Visible каждого к логическому значению. Я могу опубликовать код, если вы думаете, что это будет ваш sltn. – Killingsworth

ответ

0

Используйте решение у вас уже есть и установить Focusable свойство ложна на контроле, что неправильно получает вкладку фокус.

+0

Это было именно то, что я искал, как бы я не увидел ничего такого простого. Огромное спасибо! :) – Kryptoxx

0

Вы можете использовать DataTemplate, чтобы выбрать другой вид, основанный на типе свойства Value.

Вид:

<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> 

ViewModel:

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; 
    } 
}