wpf组合框在ContentTemplate内部时未绑定到集合
wpf combobox not binding to collection when inside ContentTemplate
我正在尝试显示基于 属性(组合框或文本框)的特定控件。所以我实现了这个内容控制:
<!--<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
本身效果很好(如果 *.ObjType == "typeA"
.
,IE 会显示一个组合框
VM 是对象的包装器 class:
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();
}
}
}
ContentControl
中根元素的DataContext
是同一个ContentControl
的Content
。尝试使用 RelativeSource
绑定到 ContentControl
的 DataContext
:
的 属性
<ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333"
ItemsSource="{Binding DataContext.ModelObjectWrapper.Values, RelativeSource={RelativeSource AncestorType=ContentControl}}"/>
顺便说一句,将 ItemsSource
绑定的 UpdateSourceTrigger
设置为 PropertyChanged
没有意义,因为 ComboBox
永远不会设置源 属性 .
我正在尝试显示基于 属性(组合框或文本框)的特定控件。所以我实现了这个内容控制:
<!--<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
本身效果很好(如果 *.ObjType == "typeA"
.
VM 是对象的包装器 class:
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();
}
}
}
ContentControl
中根元素的DataContext
是同一个ContentControl
的Content
。尝试使用 RelativeSource
绑定到 ContentControl
的 DataContext
:
<ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333"
ItemsSource="{Binding DataContext.ModelObjectWrapper.Values, RelativeSource={RelativeSource AncestorType=ContentControl}}"/>
顺便说一句,将 ItemsSource
绑定的 UpdateSourceTrigger
设置为 PropertyChanged
没有意义,因为 ComboBox
永远不会设置源 属性 .