2011-11-24 52 views
1

這是一種在WPF應用程序中使用MVVM模式的新手段,我偶然發現了一種奇怪的情況。我實際上試圖在StackOverflow上做類似於Metainputtextbox的東西(當你寫一個新問題的時候)。WPF MVVM數據綁定 - 檢查空間,然後清除複選框

那麼,我嘗試做的事:

我有一個文本框(DOH!),並將其綁定到我的viewmodel中的屬性。 在設置屬性即時檢查空間('')如果有一個空間,但它不是空的(這意味着有一個metaword在那裏)我從空間修剪它並將其保存到我的私人財產。並調用updateProp。現在來了棘手的部分。在metaword被保存後,我想清除字符串和文本框,但是將屬性設置爲「」將會再次觸發整個事件。

XAML

<TextBox 
     Name="txtBoxMetaInput" 
     Text="{Binding Path=MetaInput, Mode=TwoWay, 
     UpdateSourceTrigger=PropertyChanged}"/> 

視圖模型

private string metaInput { get; set; } 
    public string MetaInput 
    { 
     get { return metaInput; } 
     set 
     { 
      if (value.Contains(' ') && String.IsNullOrEmpty(value) == false) 
      { 
       metaInput = value.Trim(' '); 
       saveTheMetaKeyWordToAnArrayOfMetawords(); 
       this.OnPropertyChanged("MetaInput"); 
      } 
     } 
    } 

現在什麼缺失存在,我想清空文本框,並把它保存在metaword陣列後清除property's。

這個問題可能只需要在一個新的一雙眼睛:)

回答

1

現在,這裏是棘手的部分。在metaword被保存後,我想清除字符串和文本框,但是將屬性設置爲「」將會再次觸發整個事件。

只需設置後臺字段(提高PropertyChanged前),而不是屬性。這將防止價值的「重新觸發」。

+0

你是什麼意思? –

+0

Imean是啊我認爲這是適用於財產和handeling,但它不會更新控制... –

+0

@ user1057806它會 - 你只需要提高PropertyChanged爲該屬性*當你完成*。現在,你有效地將它提升2倍 - 最後只需要提升一次,以便更新控件。 –

0

最好的解決辦法可能是使用值轉換器的結合,它把來自stringstring[],然後再返回:

<local:TagConverter x:Key="TagConverter" /> 

<TextBox 
     Name="txtBoxMetaInput" 
     Text="{Binding Path=MetaInput, Mode=TwoWay, 
     UpdateSourceTrigger=PropertyChanged, Converter={StaticResource TagConverter}}"/> 

TagConverter是你寫它實現IValueConverter類。在Convert你從string轉換爲string[],在空間分裂。在ConvertBack中,您加入string[]回到string

+0

但是這仍然不會爲我清潔盒子? 我的意思是凌亂的部分,其實際上是將參數設置回null,並使文本框對新的空值作出反應。 –

+0

哦,你想在輸入每個標籤後清除文本框,而不是保留標籤列表嗎? – bruceboughton