Я пытаюсь показать определенный элемент управления на основе свойства (выпадающий список или текстовое поле). Итак, я реализовал этот контентконтроль:
<!--<ComboBox MaxWidth="200" Background="#333333" ItemsSource="{Binding ModelObjectWrapper.Values}" Grid.Row="1" Grid.Column="1"/>-->
<ContentControl Grid.Row="1" Grid.Column="1">
<ContentControl.Resources>
<Style TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding ModelObjectWrapper.ObjType}" Value="typeA">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333" ItemsSource="{Binding ModelObjectWrapper.Values, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ModelObjectWrapper.ObjType}" Value="typeB">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox />
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Resources>
</ContentControl>
Проблема в том, что в комбинированном ящике не отображаются какие-либо элементы, когда он входит в контрольную таблицу, и я знаю, что в связанном списке они есть, поэтому я предполагаю, что комбинированный список не привязан к ItemsSource
правильно.
Первая строка (имеющая только выпадающий список без шаблонов), закомментированная, работает нормально. Разве я не делаю обязательство правильно? Может ли быть так, что из-за того, что он входит в сборщик данных, он не получает права DataContext
? Я должен отметить, что DataTrigger
сам по себе прекрасно работает (IE показывает комбинированный список, если *.ObjType == "typeA"
.
ВМ - это класс-оболочка вокруг объекта:
public class ModelObjectWrapper : ViewModelBase
{
private theModelObject model_obj;
public ModelObjectWrapper(theModelObject obj)
{
model_obj = obj;
}
public ObservableCollection<string> Values
{
get { return model_obj.Values; }
set
{
if (value == model_obj.Values)
return;
model_obj.Values = value;
OnPropertyChanged();
}
}
}