我在我的WPF代碼奇怪的問題掙扎。我有一個組合框,它允許用戶選擇其中一個選項。此組合框中的每個項目都是某種string.Format()
模式。例如,當用戶選擇選項'Hello {0} world'
,我的代碼生成兩個TextBlocks
與'Hello'
和'world'
和一個TextBox
他們之間,其中用戶可以提供他的投入。WPF - 編程方式創建控件的有效性在ItemsControl中
這裏是我的XAML:
<ComboBox ItemsSource="{Binding PossiblePatternOptions}" DisplayMemberPath="Pattern" SelectedItem="{Binding SelectedPattern, ValidatesOnDataErrors=True}" Width="250" Margin="5,0,25,0"/>
<ItemsControl ItemsSource="{Binding SelectedPattern.GeneratedControls}"/>
SelectedPattern.GeneratedControls
是ObservableCollection<UIElement>
:
public ObservableCollection<UIElement> GeneratedControls
{
get
{
return _generatedControls ?? (_generateControls = new ObservableCollection<UIElement>(GenerateControls(_splittedPattern)));
}
}
下面是如何創造新的TextBox
(在GenerateControls
法):
var placeholderChunk = chunk as TextBoxPlaceholder;
var textBox = new TextBox();
textBox.ToolTip = placeholderChunk.Description;
Binding binding = new Binding("Value");
binding.ValidatesOnDataErrors = true;
binding.Source = placeholderChunk;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
textBox.SetBinding(TextBox.TextProperty, binding);
TextBoxPlaceholder
實現IDataErrorInfo
和提供錯誤信息的不正確的輸入:
public class TextBoxPlaceholder : IDataErrorInfo
{
public string Value {get;set;}
public string this[string columnName]
{
get
{
switch (columnName)
{
case "Value":
return string.IsNullOrEmpty(Value) ? "Error" : string.Empty;
default:
return string.Empty;
}
}
}
public string Error
{
get { throw new NotImplementedException(); }
}
}
的問題是,當我選擇從組合框的第一次選擇,產生TextBoxes
被正確驗證,他們得到他們周圍漂亮的紅色邊框,但當我選擇之前已選擇的選項,不會進行驗證,並且不再有紅框。我注意到,當我更改GeneratedControls
屬性中的代碼時,它每次都會重新創建集合,所以它工作正常。這裏可能是什麼問題?
我知道這可能解釋不清,在任何誤解,我會澄清的情況下。
我更新了我的問題。 – 2014-10-29 16:26:42
它沒有幫助,我認爲通知機制僅用於從代碼更新屬性時使用。我注意到了一件奇怪的事情。當我向我的文本框輸入有效的輸入並將其刪除(即使其再次無效)時,會出現紅框。有什麼想法嗎? – 2014-10-30 09:25:52
你的綁定和錯誤處理看起來好像沒什麼問題,裏面傳來記住唯一: 你確定你的**「值」當您從您的組合框的新條目**屬性被清除? 看來你的「價值」在開始時纔會被清除,當你清楚它手動(然後你的錯誤的驗證工作),但不是當你選擇一個新的條目。 – pgenfer 2014-10-31 22:52:06