2010-10-21 40 views
0

我希望這個問題在別處沒有問過,但我很難找到正確的搜索條件來提出任何已經存在的對這個問題的答案。超越數據驗證樣式:基於其他屬性的樣式

我正在用C#WPF(MVVM)實現一個程序,其中有很多采訪風格的屏幕,用戶以有序的方式輸入科學數據。我們希望TextboxDataGrid根據用戶輸入的該控件中的數據,程序輸入的默認值還是模板,分別更改前景色和背景色來自用戶導入的另一個文件的值。最重要的是,我們希望UI響應來自ViewModel中實現的IDataErrorInfo的驗證檢查。

因此,顯示在文本框中的數據可能是藍色的,如果它是一個模板值,如果程序默認爲綠色,用戶輸入時爲黑色,如果IDataErrorInfo表示它是壞數據,則爲紅色。

我對實現這個最初的答案是創建一個自定義類:

class AdornerString{ 

private string _myString; 
private bool _isTemplate; 
private bool _isDefault; 

public string MyString{ 
    get{ 
     etc. 
    } 
    set{ 
     etc. 
    } 
} 
// accessor properties and Constructors omitted for brevity 
} 

然後我在查看我所有的TextBox.Text屬性的綁定,像這樣:

<TextBox Text="{Binding Path=someAdornerString.MyString,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}"/> 

和應用風格DataTriggers響應someAdornerString的屬性來創建適當的顏色。

但是,ViewModel上的IDataErrorInfo不再驗證TextBox。爲什麼會這樣,是否有更好的方法來解決我的問題?我無法在AdornerString類中進行驗證。

一個可能的方法,雖然不可取:

唯一的其他解決方案,我能想到的就是在視圖模型的兩個屬性由用戶一個用於數據本身和所輸入的每個字段其他與上面相同的自定義類減去字符串。但是,這意味着我無法概括用於文本框的樣式。每個文本框就必須有一個自定義的風格是這樣的:

<TextBox.Style> 
    <Style TargetType="{x:Type TextBox}" 
      BasedOn="{StaticResource OtherStyle}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=**instanceCustomClass**.IsDefault}" 
         Value="True"> 
       <Setter Property="Foreground" 
         Value="Green" /> 
      </DataTrigger> 
      <Trigger Property="Validation.HasError" 
        Value="true"> 
       <Setter Property="Foreground" 
         Value="OrangeRed" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

因爲每個UI領域具有與之相關的特定的自定義類。

我會認真而不是實現這種方式,因爲我有可能100 +頁的輸入屏幕,每個屏幕有1-12 TextBox的每個屏幕,忽略混合中拋出的DataGrid(與parellel數組數組和他們的相關自定義類)。

任何想法?我已經閱讀過有關自定義驗證的內容,儘管我沒有看到在這種情況下這可能會有什麼幫助。

+0

您是否無法簡單地將TextBox的背景綁定到ViewModel上的屬性,該屬性將通過轉換器運行併爲您提供所需的「顏色」?忽略驗證元素是因爲從我收集的視覺概念來看,對於所有...只是不同的顏色。 – 2010-10-21 21:43:51

+0

@Aaron:那的確會解決非泛化風格的問題。嗯..它仍然會要求你至少有兩個屬性在ViewModel中用於UI中的每個字段:一個用於數據本身,另一個用於指示將其顯示爲哪種顏色的屬性。我希望每個字段只有一個屬性,但是如果我必須使用我發佈的解決方案,您的建議將有所幫助。謝謝! – skybluecodeflier 2010-10-21 22:38:45

+0

@skybluecodeflier更多地將它看作定義狀態。考慮到這一點,你有一個對象,其中包含字符串表示形式和數據來自哪裏,即... TemplateValue。該對象類型將成爲您將綁定到的ViewModel上的屬性,因此可以根據需要封裝相關數據。 – 2010-10-21 23:44:45

回答

0

忽略利用IDataErrInfo驗證,因爲看起來你真的想使它成爲4個值中的1個......而'壞'數據恰好就是其中之一。

您需要將物品放在平坦的運動場上,因爲您將它們視爲相同,只是區分顏色。使用一個包含ViewModel中的值和模型狀態的對象的單個屬性。忽略IDataErroInfo,然後使用轉換器提供着色,然後向AdornerString添加一個代理,該代理將被設置爲ViewModel中爲其編寫的驗證函數。