Bạn cần cung cấp một số mã để hiển thị những gì bạn đang cố gắng làm. Nếu một mục đã được chọn, tại sao mẫu của kiểm soát RichEdit
chưa được đặt?
Khi giao dịch với WPF, nó giúp làm quen với việc ràng buộc để xem các mô hình, không chỉ cho những thứ như ItemsSource
mà còn là SelectedItem
. Với kịch bản mà bạn mô tả, tôi sẽ sử dụng một ràng buộc cho SelectedItem
cho Mô hình Xem sau đó liên kết mẫu kiểm soát của RichEdit
với cùng một thuộc tính Chế độ xem, sử dụng trình chuyển đổi giá trị nếu cần. Bằng cách này, bạn không cần phải lộn xộn xung quanh với các sự kiện nhấp chuột và tương tự. Với điều kiện thuộc tính Chế độ xem là DependencyProperty
hoặc kích hoạt sự kiện PropertyChanged
(xem INotifyPropertyChanged
) mẫu kiểm soát RichEdit
của bạn sẽ tự động phản ánh lựa chọn trong trình đơn thả xuống.
** Chỉnh sửa ** Dựa trên nhận xét của bạn Tôi cho rằng hành vi bạn muốn là đặt văn bản dựa trên lựa chọn kết hợp nhưng cho phép người dùng tùy chỉnh văn bản đó. Tuy nhiên, nếu chỉnh sửa, họ có thể chọn lại giá trị kết hợp để đặt lại văn bản. Vấn đề là nếu mục đã được chọn thì không có sự kiện nào được kích hoạt để móc vào. Giải pháp là nếu nội dung văn bản thay đổi, điều này sẽ bỏ chọn bất kỳ lựa chọn kết hợp nào (vì combo không còn phản ánh nội dung của hộp văn bản nữa.) Các ràng buộc có thể quản lý điều này khá độc đáo:
Chế độ xem ví dụ này sử dụng TextBox vì đơn giản:
<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>
ViewModel:
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));
}
}
và dây điện nó lên:
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();
Điều này liên kết hộp kết hợp, sau đó là mục được chọn, hộp văn bản được cập nhật tự động. Khi nội dung của hộp văn bản thay đổi, mẫu được kiểm tra để xem liệu nó có phù hợp và nếu không, mục kết hợp được bỏ chọn. Nếu mục nhập khớp với mẫu thì mẫu đó sẽ được chọn tự động.
Sau khi chèn u thay đổi chỉ mục đã chọn thành -1 – Paparazzi