WPF:UserControl 在设计时未在 ContentControl 的 Datatemplate 中显示
WPF: UserControl not displaying at design time inside Datatemplate for a ContentControl
我花了很多天时间试图弄清楚这里有什么问题,我怀疑这是 VS 中的一个错误或者我监督的一些简单的东西...
我有一个 ContentControl
服务于视图模型:
<!-- Learning control from DataTemplate -->
<ContentControl Content = "{Binding learningViewModel}"
Grid.Row = "1"
Grid.Column = "1"
Height = "300"
Margin = "20, 0, 0, 0"/>
它所绑定的属性实际上是一组视图模型的接口。
然后我对可能的 ViewModels
:
定义了 DataTemplate
<Window.Resources>
<DataTemplate DataType="{x:Type vm:vmLearnSpeak}">
<local:viewLearnSpeak CommandNotKnown = "{Binding DataContext.cmdNotKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandAlmostKnown = "{Binding DataContext.cmdAlmostKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandKnown = "{Binding DataContext.cmdKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:vmLearnWrite}">
<local:viewLearnWrite CommandNotKnown = "{Binding DataContext.cmdNotKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandAlmostKnown = "{Binding DataContext.cmdAlmostKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandKnown = "{Binding DataContext.cmdKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:vmLearnListen}">
<local:viewLearnListen CommandNotKnown = "{Binding DataContext.cmdNotKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandAlmostKnown = "{Binding DataContext.cmdAlmostKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandKnown = "{Binding DataContext.cmdKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
</DataTemplate>
</Window.Resources>
在程序执行期间,绑定按预期工作。
然而在设计时,ContentControl
将只显示表示视图模型路径的纯字符串(例如“MyApp.ViewModels.vmLearnSpeak”)。
所有视图模型都有初始化一些虚拟数据的默认构造函数,如果我更改 ViewModel
中的虚拟初始化,属性 绑定到 ContentControl
,那么设计器中的 DataTemplate 也按预期进行了更改(例如,字符串更改为“MyApp.ViewModels.vmLearnWrite”)。
如果我用按钮之类的另一个控件替换 DataTemplate
内容,如果设置了带有按钮的 DataTemplate
的相应 Data
,我就会显示按钮。
所以总的来说,DataTemplate
基本上是有效的。
自定义控件也可以工作:如果我将 DataTemplate 中的代码直接放在布局中,则控件会按预期显示。
因此,如果将控件放置在 DataTemplate
...
中,似乎只有在设计时控件才会显示失败
希望我提供了足够的信息,否则请告诉我...在此先感谢您的支持!
顺便说一句:运行 Visual Studio 2016 社区,以防万一可能存在已知错误(在花了这么多时间尝试修复之后我不确定,但我相信它曾经有效前段时间...)
编辑:
问题确实出在 UserControl
,如果我添加一个简单的空白按钮或仅使用一个按钮 UserControl
,也会出现同样的问题。但是,如果我放 CustomControl
或常规 Button
,则会显示 DataTemplate
...
仅供参考:显然这是 Visual studio 中的一个错误,已修复,但我不确定它何时会发布:
我花了很多天时间试图弄清楚这里有什么问题,我怀疑这是 VS 中的一个错误或者我监督的一些简单的东西...
我有一个 ContentControl
服务于视图模型:
<!-- Learning control from DataTemplate -->
<ContentControl Content = "{Binding learningViewModel}"
Grid.Row = "1"
Grid.Column = "1"
Height = "300"
Margin = "20, 0, 0, 0"/>
它所绑定的属性实际上是一组视图模型的接口。
然后我对可能的 ViewModels
:
DataTemplate
<Window.Resources>
<DataTemplate DataType="{x:Type vm:vmLearnSpeak}">
<local:viewLearnSpeak CommandNotKnown = "{Binding DataContext.cmdNotKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandAlmostKnown = "{Binding DataContext.cmdAlmostKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandKnown = "{Binding DataContext.cmdKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:vmLearnWrite}">
<local:viewLearnWrite CommandNotKnown = "{Binding DataContext.cmdNotKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandAlmostKnown = "{Binding DataContext.cmdAlmostKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandKnown = "{Binding DataContext.cmdKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:vmLearnListen}">
<local:viewLearnListen CommandNotKnown = "{Binding DataContext.cmdNotKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandAlmostKnown = "{Binding DataContext.cmdAlmostKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}"
CommandKnown = "{Binding DataContext.cmdKnown, RelativeSource={RelativeSource AncestorType=local:wndSession}}" />
</DataTemplate>
</Window.Resources>
在程序执行期间,绑定按预期工作。
然而在设计时,ContentControl
将只显示表示视图模型路径的纯字符串(例如“MyApp.ViewModels.vmLearnSpeak”)。
所有视图模型都有初始化一些虚拟数据的默认构造函数,如果我更改 ViewModel
中的虚拟初始化,属性 绑定到 ContentControl
,那么设计器中的 DataTemplate 也按预期进行了更改(例如,字符串更改为“MyApp.ViewModels.vmLearnWrite”)。
如果我用按钮之类的另一个控件替换 DataTemplate
内容,如果设置了带有按钮的 DataTemplate
的相应 Data
,我就会显示按钮。
所以总的来说,DataTemplate
基本上是有效的。
自定义控件也可以工作:如果我将 DataTemplate 中的代码直接放在布局中,则控件会按预期显示。
因此,如果将控件放置在 DataTemplate
...
希望我提供了足够的信息,否则请告诉我...在此先感谢您的支持!
顺便说一句:运行 Visual Studio 2016 社区,以防万一可能存在已知错误(在花了这么多时间尝试修复之后我不确定,但我相信它曾经有效前段时间...)
编辑:
问题确实出在 UserControl
,如果我添加一个简单的空白按钮或仅使用一个按钮 UserControl
,也会出现同样的问题。但是,如果我放 CustomControl
或常规 Button
,则会显示 DataTemplate
...
仅供参考:显然这是 Visual studio 中的一个错误,已修复,但我不确定它何时会发布: