数据模板内的自绑定不起作用
Self Binding inside datatemplate not working
我的模型 class 中有一个 属性,如下所示,它是一个枚举。
public class VmOutputCarouselBarCodeServiceControlData : BindableBaseThreadSafe
{
private SensorBufferState _lockStatus;
public SensorBufferState LockStatus
{
get => _lockStatus;
set => Set(ref _lockStatus, value);
}
}
在我的VM中,它是整个视图的DataContext,我设置的值如下,
public class VM
{
public VmOutputCarouselBarCodeServiceControlData VmOutputControlData { get; set; }
public VM()
{
VmOutputControlData=new VmOutputCarouselBarCodeServiceControlData();
VmOutputControlData.LockStatus=SensorBufferState.Active;
}
}
public enum SensorBufferState
{
Default,
Active,
InActive,
Error
}
在我的 xaml 中,我在数据模板中有一个数据模板,如下所示:
<DataTemplate x:Key="OutputTemplate">
<Grid>
<ContentControl Grid.Row="0"
Grid.Column="1"
DataContext="{Binding VmOutputControlData.LockStatus}"
ContentTemplate="{StaticResource ErrorContentControl}"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="ErrorContentControl">
<Grid>
<Rectangle x:Name="SensorStatusRectangle"
Fill="{Binding Path=.,Mode=OneWay,Converter={StaticResource SensorBufferToColorConverter}}"
Height="30"
Width="60"/>
</Grid>
</DataTemplate>
在xaml.cs
整个视图的数据上下文设置为 VM
问题是当我在转换器中保留一个断点时 class 它永远不会命中。但是当我删除 .从绑定路径,断点来到转换器。 ContentControl 的 DataContext 显示为 Active,这是枚举状态之一。但是绑定不起作用。请帮忙。
DataTemplate
实际上没有申请。不能。
DataTemplate
或一般来说 ContentControl.ContentTemplate
将适用于 ContentControl.Content
属性 而不是 ContentControl.DataContext
.
这意味着 DataTemplate
的 DataContext
不是 ContentControl
的 DataContext
,而是 Content
或 ContentControl.Content
属性.
要使模板工作,您必须设置 Content
而不是 DataContext
:
<ContentControl Content="{Binding VmOutputControlData.LockStatus}"
ContentTemplate="{StaticResource ErrorContentControl}"/>
现在 ContentControl
有内容,DataTemplate
将被应用,绑定将解析并调用转换器。
<DataTemplate DataType={x:Type SensorBufferState}">
<Grid>
<Rectangle x:Name="SensorStatusRectangle"
Fill="{Binding Path=., Mode=OneWay, Converter={StaticResource SensorBufferToColorConverter}}" />
</Grid>
</DataTemplate>
我的模型 class 中有一个 属性,如下所示,它是一个枚举。
public class VmOutputCarouselBarCodeServiceControlData : BindableBaseThreadSafe
{
private SensorBufferState _lockStatus;
public SensorBufferState LockStatus
{
get => _lockStatus;
set => Set(ref _lockStatus, value);
}
}
在我的VM中,它是整个视图的DataContext,我设置的值如下,
public class VM
{
public VmOutputCarouselBarCodeServiceControlData VmOutputControlData { get; set; }
public VM()
{
VmOutputControlData=new VmOutputCarouselBarCodeServiceControlData();
VmOutputControlData.LockStatus=SensorBufferState.Active;
}
}
public enum SensorBufferState
{
Default,
Active,
InActive,
Error
}
在我的 xaml 中,我在数据模板中有一个数据模板,如下所示:
<DataTemplate x:Key="OutputTemplate">
<Grid>
<ContentControl Grid.Row="0"
Grid.Column="1"
DataContext="{Binding VmOutputControlData.LockStatus}"
ContentTemplate="{StaticResource ErrorContentControl}"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="ErrorContentControl">
<Grid>
<Rectangle x:Name="SensorStatusRectangle"
Fill="{Binding Path=.,Mode=OneWay,Converter={StaticResource SensorBufferToColorConverter}}"
Height="30"
Width="60"/>
</Grid>
</DataTemplate>
在xaml.cs
整个视图的数据上下文设置为 VM
问题是当我在转换器中保留一个断点时 class 它永远不会命中。但是当我删除 .从绑定路径,断点来到转换器。 ContentControl 的 DataContext 显示为 Active,这是枚举状态之一。但是绑定不起作用。请帮忙。
DataTemplate
实际上没有申请。不能。
DataTemplate
或一般来说 ContentControl.ContentTemplate
将适用于 ContentControl.Content
属性 而不是 ContentControl.DataContext
.
这意味着 DataTemplate
的 DataContext
不是 ContentControl
的 DataContext
,而是 Content
或 ContentControl.Content
属性.
要使模板工作,您必须设置 Content
而不是 DataContext
:
<ContentControl Content="{Binding VmOutputControlData.LockStatus}"
ContentTemplate="{StaticResource ErrorContentControl}"/>
现在 ContentControl
有内容,DataTemplate
将被应用,绑定将解析并调用转换器。
<DataTemplate DataType={x:Type SensorBufferState}">
<Grid>
<Rectangle x:Name="SensorStatusRectangle"
Fill="{Binding Path=., Mode=OneWay, Converter={StaticResource SensorBufferToColorConverter}}" />
</Grid>
</DataTemplate>