【发布时间】:2014-12-06 00:25:10
【问题描述】:
期望
我的控件应如Figure 1 所示。单击标题为“第二”的按钮后,控件的内容应该会发生变化,如Figure 2 所示。在这个图中,状态应该是内容在发送密钥后再次变回输入文本框。
解决方案
我创建了两个 DataTemplate。这些 DataTemplate 应根据 IsEditable 属性的更改而更改。默认 DataTemplate 称为 CompactDataTemplate,当 IsEditable 值等于 FALSE 时应使用该模板。 当 IsEditable 变为 TRUE 时,应使用 EditableDataTemplate。
文件 TestUserControl.xaml
<UserControl x:Class="JP4.Controls.TestControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="26" d:DesignWidth="200" Style="{DynamicResource TestControlStyle}">
<UserControl.Resources>
CompactDataTemplate
<DataTemplate x:Key="CompactDataTemplate" DataType="{x:Type UserControl}">
<StackPanel Orientation="Horizontal">
<Button Content="First Button" />
<Button Content="Second Button" Click="SecondButton_Click" />
</StackPanel>
</DataTemplate>
可编辑数据模板
<DataTemplate x:Key="EditableDataTemplate" DataType="{x:Type UserControl}">
<StackPanel Orientation="Horizontal">
<TextBox Text="Press enter" />
</StackPanel>
</DataTemplate>
TestControlStyle 包含在 IsEditable 已更改时应触发的触发器
<Style x:Key="TestControlStyle" TargetType="{x:Type UserControl}">
<Setter Property="ContentTemplate" Value="{StaticResource CompactDataTemplate}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type UserControl}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsEditable}" Value="true">
<Setter Property="ContentTemplate" Value="{StaticResource EditableDataTemplate}" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
</UserControl>
文件TestUserControl.xaml.cs
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace TestControl
{
/// <summary>
/// Interaction logic for TestControl.xaml
/// </summary>
public partial class TestUserControl : UserControl, INotifyPropertyChanged, INotifyPropertyChanging
{
/// <summary>
/// Constructors
/// </summary>
public TestUserControl()
{
InitializeComponent();
}
// Properties
private bool _IsEditable;
public bool IsEditable
{
get { return _IsEditable; }
set
{
_IsEditable = value;
NotifyPropertyChanged("IsEditable");
}
}
// Controls events
private void SecondButton_Click(object sender, RoutedEventArgs e)
{
IsEditable = true;
}
private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Enter)
IsEditable = false;
}
// INotifyPropertyChanged implementation
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void NotifyPropertyChanging(string propertyName)
{
if (PropertyChanging != null)
PropertyChanging.Invoke(this, new PropertyChangingEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangingEventHandler PropertyChanging;
}
}
MainWindow.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestControl" x:Class="TestControl.MainWindow"
Title="MainWindow" Height="170" Width="328">
<Grid>
<local:TestUserControl HorizontalAlignment="Left" Margin="76,57,0,0" VerticalAlignment="Top" Width="148"/>
</Grid>
</Window>
最后是 MainWindow.xaml.cs
using System.Windows;
namespace TestControl
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
希望,现在很清楚,我想要什么。我想更改我的 UserControl 的 ContentTemplate。此更改应由监视属性 IsEditable 的触发器触发。
问题
IsEditable 属性正在更改,但触发器未触发。问题出在哪里?
对于我之前不清楚的帖子,我深表歉意。
所有可以从与 Figures 相同的位置下载的项目文件只需将文件名更改为 TestControl.zip(不能发布超过两个链接)
【问题讨论】:
-
没有一个好的代码示例,我不完全理解您要完成的工作。见stackoverflow.com/help/mcve。使用您提供的代码并尝试猜测您是如何使用它的,我什至无法显示初始模板。 IE。
UserControl显示时没有任何模板数据。 -
DataTemplateSelector 怎么样?
标签: c# wpf xaml user-controls