2014-01-13 24 views
0

我對Silverlight非常新,並且正在使用MVVM模式的項目。這意味着我不想編寫代碼來完成此任務(解決方案架構師對此要求非常清楚),而是我正在尋找一種完全在XAML中完成的方法。Silverlight MVVM:基於Silverlight中的綁定值更改DataGrid中的單元格邊框顏色

我有一個看起來像這樣兩類:

using System.Collections.ObjectModel; 

namespace SilverlightApplication2.ViewModels 
{ 
    public class ClassA 
    {  
     public long ClassAValueOne { get; set; } 

     public ObservableCollection<ClassB> ClassBs { get; set; } 
    } 

} 


namespace SilverlightApplication2.ViewModels 
{ 
    public class ClassB 
    { 
     public long? ClassBValueOne { get; set; } 

     public long? ClassBValueTwo { get; set; } 

     public long? ClassBValueThree { get; set; } 

     public long? ClassBValueFour { get; set; } 
    } 
} 

,看起來像這樣的視圖模型類:

using System.Collections.ObjectModel; 

namespace SilverlightApplication2.ViewModels 
{ 
    public class EditorViewModel 
    {  
     public EditorViewModel() 
     { 
      this.ClassAs = new ObservableCollection<ClassA> 
      { 
       new ClassA 
       { 
        ClassAValueOne = 1, 
        ClassBs = new ObservableCollection<ClassB> 
        { 
         new ClassB { ClassBValueOne = 1, ClassBValueTwo = 2, ClassBValueThree = 3, ClassBValueFour = 4 }, 
         new ClassB { ClassBValueOne = 5, ClassBValueTwo = 6, ClassBValueThree = 7, ClassBValueFour = 8 }, 
         new ClassB { ClassBValueOne = 9, ClassBValueTwo = 10, ClassBValueThree = 11, ClassBValueFour = 12 } 
        } 
       }, 
       new ClassA 
       { 
        ClassAValueOne = 3, 
        ClassBs = new ObservableCollection<ClassB> 
        { 
         new ClassB(), 
         new ClassB(), 
         new ClassB() 
        } 
       } 
      }; 
     } 

     public ObservableCollection<ClassA> ClassAs { get; set; } 
    } 
} 

而且看起來像這樣一個觀點:

<controls:ChildWindow x:Class="SilverlightApplication2.Views.ExemptionEditor" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" 
      xmlns:viewmodels="clr-namespace:SilverlightApplication2.ViewModels" 
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
      xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
      xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" 
      xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
      Width="470" Height="700" 
      Title="Exemption Editor"> 

    <controls:ChildWindow.DataContext> 
     <viewmodels:EditorViewModel/> 
    </controls:ChildWindow.DataContext> 

    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding DialogResult}"> 
      <ei:ChangePropertyAction TargetObject="{Binding ElementName=ExemptionEditorChildWindow}" PropertyName="DialogResult" Value="{Binding DialogResult}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 

    <controls:ChildWindow.Resources> 
    </controls:ChildWindow.Resources> 

    <Grid x:Name="LayoutRoot" Margin="2"> 
     <Grid.Resources> 
      <Style x:Key="DataGridTextColumnReadOnlyBackgroundColor" TargetType="sdk:DataGridCell"> 
       <Setter Property="Background" Value="#C6DEFE" /> 
      </Style> 
     </Grid.Resources> 

     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <ListBox ItemsSource="{Binding ClassAs}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <toolkit:Expander IsExpanded="True"> 
         <toolkit:Expander.Header> 
          <Border Background="#FF99CC00"> 
           <TextBlock Text="{Binding Path=ClassAValueOne}" FontWeight="Bold" Foreground="Black"></TextBlock> 
          </Border> 
         </toolkit:Expander.Header> 
         <StackPanel Orientation="Vertical"> 
          <TextBlock Text="{Binding Path=ClassAValueOne, StringFormat='Enter data for item {0}'}" Margin="5,10,0,10" Foreground="Black" FontWeight="Bold"/> 
          <sdk:DataGrid ItemsSource="{Binding ClassBs}" AutoGenerateColumns="False" HorizontalAlignment="Center" VerticalAlignment="Center" RowHeight="20" Margin="0, 0, 0, 10"> 
           <sdk:DataGrid.Columns> 
            <sdk:DataGridTextColumn Binding="{Binding ClassBValueOne}" Header="ValueOne" FontWeight="Bold" Width="100" IsReadOnly="True" CellStyle="{StaticResource DataGridTextColumnReadOnlyBackgroundColor}"/> 
            <sdk:DataGridTextColumn Binding="{Binding ClassBValueTwo, Mode=TwoWay}" Header="ValueTwo" FontWeight="Bold" Width="100"/> 
            <sdk:DataGridTextColumn Binding="{Binding ClassBValueThree, Mode=TwoWay}" Header="ValueThree" FontWeight="Bold" Width="100"/> 
            <sdk:DataGridTextColumn Binding="{Binding ClassBValueFour, Mode=TwoWay}" Header="ValueFour" FontWeight="Bold" Width="100"/> 
           </sdk:DataGrid.Columns> 
          </sdk:DataGrid> 
         </StackPanel> 
        </toolkit:Expander> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

</controls:ChildWindow> 

我有兩個UI要求:

  1. 如果ClassB中的任何值屬性都爲null,則表示該值的數據網格單元格應該在其周圍有一個紅色邊框,以引起用戶注意他們需要將值輸入到該單元格中。
  2. 如果用戶嘗試在ClassB的value屬性(鍵入爲可爲空的長整型)的單元格中鍵入字符串,則單元格背景將變爲紅色,以引起用戶注意他們無法輸入字符串價值進入細胞。

我已經搜索了可能的方法來完成此操作,但是我發現的所有內容都是針對WPF的,並且指的是使用Silverlight中不存在的DataTemplateSelector。

任何幫助?

回答

0

這比您想象的要容易! 你只需要使用一些驗證屬性。

請查看以下鏈接:

http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

http://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validation-with-the-data-annotation-validators-cs

PS:有在ASPX一些例子,但是你可以申請再Silverlight的爲好。

祝你好運!

+0

感謝您的回答。不幸的是,這不是我的客戶正在尋找的。我從那裏開始是因爲這是一個非常簡單的解決方案,但客戶有一些非常嚴格的用戶界面要求。這些要求如我的問題所述。他們需要數據註釋不提供的非常特定的UI反饋。 – meyousikmann

相關問題