2014-10-29 69 views
0

我在我的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.GeneratedControlsObservableCollection<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屬性中的代碼時,它每次都會重新創建集合,所以它工作正常。這裏可能是什麼問題?

我知道這可能解釋不清,在任何誤解,我會澄清的情況下。

回答

0

看來,當它改變了你的「價值」屬性不火的更新,所以文本的文本框的結合不能對變化反應,不會再評估值。嘗試這樣的:

// implmeent INotifyPropertyChanged 
public class TextBoxPlaceholder : IDataErrorInfo, System.ComponentModel.INotifyPropertyChanged 
{ 
    private string mValue; 

    public string Value 
    { 
     get{ return mValue; } 
     // fire notification 
     set{mValue = value;NotifyPropertyChanged("Value");} 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    // helper method 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    // your code goes here 
+0

我更新了我的問題。 – 2014-10-29 16:26:42

+0

它沒有幫助,我認爲通知機制僅用於從代碼更新屬性時使用。我注意到了一件奇怪的事情。當我向我的文本框輸入有效的輸入並將其刪除(即使其再次無效)時,會出現紅框。有什麼想法嗎? – 2014-10-30 09:25:52

+0

你的綁定和錯誤處理看起來好像沒什麼問題,裏面傳來記住唯一: 你確定你的**「值」當您從您的組合框的新條目**屬性被清除? 看來你的「價值」在開始時纔會被清除,當你清楚它手動(然後你的錯誤的驗證工作),但不是當你選擇一個新的條目。 – pgenfer 2014-10-31 22:52:06

相關問題