Самопрямывание внутри таблички данных не работает - PullRequest
0 голосов
/ 15 апреля 2020

У меня в классе модели есть свойство, которое является перечислением.

public class VmOutputCarouselBarCodeServiceControlData : BindableBaseThreadSafe
{
 private SensorBufferState _lockStatus;
 public SensorBufferState LockStatus
        {
            get => _lockStatus;
            set => Set(ref _lockStatus, value);
        }
}

В моей виртуальной машине, которая является 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

Контекст данных установлен на ВМ для всего представления

Проблема в том, что когда я сохраняю точку останова внутри класса конвертера, он никогда не срабатывает. Но пока он работает, когда я удаляю. из обязательного пути точка останова поступает в преобразователь. DataContext ContentControl отображается как активный, который является одним из состояний перечисления. Тем не менее, привязка не работает. Пожалуйста помоги.

1 Ответ

1 голос
/ 15 апреля 2020

DataTemplate на самом деле не применяется. Это не может.

DataTemplate или вообще ContentControl.ContentTemplate будут применяться к свойству ContentControl.Content, а не к ContentControl.DataContext.
Это означает DataContext DataTemplate - это не DataContext ContentControl, а 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>
...