我有一个ItemsControl,在其中我显示不同的属性和值,一边是名字,另一边是TextBox。 ItemsSource是自定义类的对象的集合,具有Name,Value和PropertyType属性(使用reflection propertyinfo)
现在我想通过检测属性是否为bool类型来改进这一点,例如,它会显示复选框而不是文本框。这可以使用DataTrigger吗?
我使用Control对其进行半工作,我根据类型将模板设置为文本框或复选框,但当我尝试“选项卡”到下一个文本框或复选框时,它会聚焦具有首先是文本框/复选框,只有在另一个“选项卡”之后,它才会聚焦包含的文本框/复选框/..
因此,如果有人知道这方面的解决方案,那将非常感谢!
答案 0 :(得分:0)
您可以使用DataTemplate根据Value属性类型选择不同的View。
查看:
<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;
}
}
答案 1 :(得分:0)
使用您已有的解决方案,并在错误地获得标签焦点的控件上将Focusable属性设置为false。