您需要提供一些代码来显示您要执行的操作。如果已经选择了一个项目,为什么还RichEdit
没有设置控件的模板?
在处理 WPF 时,熟悉与视图模型的绑定会有所帮助,不仅适用于ItemsSource
诸如SelectedItem
. 鉴于您描述的场景,我将使用绑定SelectedItem
到视图模型,然后将RichEdit
控件的模板绑定到相同的视图模型属性,如有必要,使用值转换器。这样你就不需要搞乱点击事件等。如果 View Model 的属性是一个DependencyProperty
或触发一个PropertyChanged
事件(请参阅 参考资料INotifyPropertyChanged
),您的RichEdit
控件模板应该会自动反映下拉菜单中的选择。
** 编辑 ** 根据您的评论,我假设您想要的行为是基于组合选择设置文本,但允许用户自定义该文本。但是,如果进行了编辑,他们应该能够重新选择组合值来重置文本。问题是如果该项目已经被选中,那么就没有触发事件来挂钩。解决方案是,如果文本内容发生变化,这应该取消选择任何组合选择(因为组合不再反映文本框的内容。)绑定可以很好地管理这个:
为简单起见,此示例视图使用 TextBox:
<Window x:Class="UISample.UITemplateSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="UITemplateSample" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Path=Templates}" SelectedItem="{Binding Path=SelectedTemplate}" DisplayMemberPath="Name"/>
<TextBox Grid.Row="1" AcceptsReturn="True" TextWrapping="Wrap" Text="{Binding Path=Text}"/>
</Grid>
视图模型:
class TemplateSampleViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<TextTemplate> Templates
{
get;
private set;
}
private TextTemplate _selectedTemplate;
public TextTemplate SelectedTemplate
{
get{ return _selectedTemplate; }
set
{
if ( _selectedTemplate == value )
return;
_selectedTemplate = value;
if (_selectedTemplate != null)
Text = _selectedTemplate.TemplateText;
firePropertyChanged("SelectedTemplate");
}
}
private string _text;
public string Text
{
get { return _text; }
set
{
if ( _text == value )
return;
_text = value;
firePropertyChanged( "Text" );
var matchingTemplate = Templates.FirstOrDefault( t => t.TemplateText == _text );
SelectedTemplate = matchingTemplate;
}
}
public TemplateSampleViewModel(IEnumerable<TextTemplate> templates)
{
Templates = new ObservableCollection<TextTemplate>(templates);
}
private void firePropertyChanged(string propertyName)
{
if ( PropertyChanged != null )
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
并将其接线:
var viewModel = new TemplateSampleViewModel(new[]
{
new TextTemplate {Name = "First", TemplateText = "This is the first item"},
new TextTemplate {Name = "Second", TemplateText = "This is the second item"},
new TextTemplate {Name = "Third", TemplateText = "This is the third item"},
});
var test = new UITemplateSample {DataContext = viewModel};
test.Show();
这将绑定组合框,然后在选择项目时,文本框会自动更新。当文本框内容发生变化时,会检查模板以查看它是否仍然匹配,如果不匹配,则取消选择组合项。如果条目与模板匹配,则自动选择该模板。