【问题标题】:Self Binding inside datatemplate not working数据模板内部的自绑定不起作用
【发布时间】:2020-04-15 15:40:47
【问题描述】:

我的模型类中有一个属性,如下所示,它是一个枚举。

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

在作为整个视图的 DataContext 的 VM 中,我将值设置如下,

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

问题是当我在转换器类中保留一个断点时,它永远不会命中。但是当我删除它时它正在运行。从绑定路径,断点来到转换器。 ContentControl 的 DataContext 显示为 Active,这是枚举状态之一。然而绑定不起作用。请帮忙。

【问题讨论】:

    标签: c# wpf mvvm datatemplate


    【解决方案1】:

    DataTemplate 实际上并没有申请。不能。

    DataTemplate 或通常的ContentControl.ContentTemplate 将适用于ContentControl.Content 属性,而不适用于ContentControl.DataContext
    这意味着DataTemplateDataContext 不是ContentControlDataContext,而是ContentContentControl.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>
    

    【讨论】:

    • 谢谢,我做了更改,但即便如此,只有在应用程序运行时绑定路径发生更改,然后它会到达断点。
    • 谢谢我已经试过了。顺便说一句,它是一个愚蠢的 Uwp 应用程序。我必须将 Binding Path=., Converter=... 更改为 x:Bind Converter=... 并且它可以工作。我认为它的 uwp 绑定。
    • 好的。我懂了。您发布了这个标记为 WPF 的问题。这就是为什么我从未考虑过x:Bind。所以你使用了错误的标签 :) 两个框架有相似之处 - 从表面上看。几乎所有内容都是从头开始实施以适应新的运行时环境。标记扩展系统(如Binding)也不例外。他们借此机会改进了一些基本概念。 x:Bind 就是一个例子。 UWP 的外观和行为与 WPF 非常相似,但在细节方面它们确实不同。你觉得UWP怎么样,你用的专业吗?很多公司都不愿意引入它
    • 是的,不幸的是,我们被那个 uwp 困住了。尽管有很多相似之处,但它并没有很多 wpf 具有的关键功能,例如相对源,这确实很痛苦。它没有很多小东西,如布局转换、Multibinding、MultiDataTriggers 等。即使对于 DockPanel 和 uniformgrid,您也必须依赖 xaml 控件库,通过 nuget 添加它。是的,我添加了 wpf 标签,因为 uwp 的社区是如此之小,而且对于这个问题,我想它在 wpf 中也是一样的。我在一家名为 Beckman Coulter 的公司工作。虽然很多团队使用 wpf,但我们使用 uwp。
    • 是的,这也是我的观察。 UWP 还没有完成。我喜欢沙盒般的环境。应用程序现在有更多限制,以防止粗心的开发人员侵犯用户隐私。您现在可以绑定到方法。带有灯光效果和 Segoe MDL2 图标集的 UI 看起来非常漂亮。 UWP 提供与 Windows 10 环境的更多集成,例如对深色/浅色主题和强调色或一般主题的原生支持。针对多个设备的反应式 UI。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2013-12-29
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多