WPF 편집 가능한 콤보 박스
콤보박스와 콤보박스가 있습니다.IsEditable 속성은 ComboBox가 TextBox와 드롭다운 목록을 동시에 작동하도록 True로 설정됩니다.그러나 ComboBox가 데이터 바인딩된 경우 사용자 지정 텍스트를 입력해도 데이터 바인딩된 컬렉션에 새 항목이 추가되지 않습니다.
예를 들어, 사용자 목록에 바인딩된 ComboBox에 'Joe'를 입력하면 값 'Joe'가 드롭다운 목록에 자동으로 추가되지 않습니다.
어떻게 대처하면 좋을까요?
여기 기본이 있습니다.MVVM
원하는 동작을 얻을 수 있는 컴플라이언스 방법:
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ComboBox Margin="30,5,30,5"
IsEditable="True"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
Text="{Binding NewItem, UpdateSourceTrigger=LostFocus}"/>
<TextBox Margin="30,5,30,5" />
</StackPanel>
</Window>
MainWindow.cs
public partial class MainWindow : Window, INotifyPropertyChanged
{
private string _selectedItem;
private ObservableCollection<string> _items = new ObservableCollection<string>()
{
"One",
"Two",
"Three",
"Four",
"Five",
};
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public IEnumerable Items
{
get { return _items; }
}
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
public string NewItem
{
set
{
if (SelectedItem != null)
{
return;
}
if (!string.IsNullOrEmpty(value))
{
_items.Add(value);
SelectedItem = value;
}
}
}
protected void OnPropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
윈도우에 다른 컨트롤을 배치해야 했습니다.UpdateSourceTrigger
의 특성Text
에 구속력이 있는.LostFocus
. 창에 다른 컨트롤이 없는 경우Combobox
절대 집중력을 잃지 않을 거예요.
기본 업데이트 모드가 다음과 같기 때문에 업데이트 모드를 변경했습니다.Propertychanged
각 키 입력에 대해 새 항목이 추가됩니다.
예: "윈도" 텍스트를 입력하면 다음 항목이 컬렉션에 추가됩니다.
W
Wi
Win
Wind
Windo
Window
LostFocus 이벤트에서 처리하겠습니다.
여기서 Selected가항목이 null입니다.이 경우 텍스트 값을 바인딩 목록에 추가하고 Selected를 설정합니다.새 항목에 대한 항목입니다.
XAML의 경우:
<ComboBox Name="_list" LostFocus="LostFocus" IsEditable="True"/>
코드 비하인드:
private ObservableCollection<string> _names;
public MainWindow()
{
InitializeComponent();
_names = new ObservableCollection<string> {"Eric", "Phillip"};
_list.SetBinding(ItemsControl.ItemsSourceProperty, new Binding {Source = _names});
}
private void LostFocus(object sender, RoutedEventArgs e)
{
var comboBox = (ComboBox) sender;
if(comboBox.SelectedItem != null)
return;
var newItem = comboBox.Text;
_names.Add(newItem);
comboBox.SelectedItem = newItem;
}
이것이 도움이 되기를 바랍니다:)
MVVM 접근 방식을 사용하여 ComboBox를 바인딩하는 것이 좋습니다.ViewModel의 일부 TextProperty에 대한 텍스트입니다(같은 내용은 뷰에 문자열 속성을 추가하는 것만으로 가능합니다).그런 다음 보기에서 "커밋"된 방식에 관계없이 이 특성의 설정기에서 입력을 처리하고 목록에 새 항목을 추가할 수 있습니다.AFAIK에는 새로운 아이템을 데이터 소스에 추가하는 기본 메커니즘이 없습니다.어쨌든 아이템 생성은 직접 하셔야 합니다.
또는 둘 다 바인딩할 수 있습니다. - 선택됨ComboBox의 항목 및 텍스트 - 사용자가 이미 알고 있는 항목을 입력한 경우 검색을 방지합니다.하지만 그 부분은 당신의 질문에 대답하기에 덜 중요할 수 있습니다.
게일 씨의 대답에 근거해서 이랬어요문자열 대신 부동 목록을 사용하여 입력한 값이 목록에 이미 추가되었는지 확인합니다.
private float zoomFactor = 2;
public float ZoomFactor
{
get { return zoomFactor; }
set
{
SetProperty(ref zoomFactor, value);
}
public float NewZoom
{
get { return zoomFactor; }
set
{
if (!zoomValues.Contains(value))
zoomValues.Add(value);
ZoomFactor = value;
}
}
private ObservableCollection<float> zoomValues = new ObservableCollection<float>()
{
1, 2, 3, 4
};
public ObservableCollection<float> ZoomValues { get => zoomValues; }
및 XAML:
<ComboBox
IsEditable="True"
ItemsSource="{Binding ZoomValues}"
SelectedItem="{Binding ZoomFactor}"
Text="{Binding NewZoom, UpdateSourceTrigger=LostFocus}"/>
언급URL : https://stackoverflow.com/questions/3373239/wpf-editable-combobox
'programing' 카테고리의 다른 글
OS X Lion에서 단말기가 로드되지 않는 문제를 수정하는 방법 ~/.bashrc (0) | 2023.04.12 |
---|---|
WPF 사이즈를 물리 픽셀로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
찾기를 사용하여 하위 디렉터리 제외 (0) | 2023.04.12 |
Microsoft를 사용하여 .xlsx로 내보내기Office.Interop.Excel SaveAs 오류 (0) | 2023.04.12 |
Get-ChildItem 재귀 깊이 제한 (0) | 2023.04.12 |