2014-01-13 3 views
0

Я очень новичок в Silverlight и работаю над проектом, использующим шаблон MVVM. Это означает, что я не хочу писать код для выполнения этой задачи (архитектор решений очень ясен по этому требованию), но я ищу способ полностью сделать это в XAML.Silverlight MVVM: изменение цвета границы ячейки в DataGrid на основе связанного значения в Silverlight

У меня есть два класса, которые выглядят следующим образом:

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> 

У меня есть два требования к пользовательскому интерфейсу:

  1. Если какое-либо из свойств значения в ClassB имеет значение NULL, ячейка сетки данных, представляющая это нулевое значение, должна иметь красную рамку вокруг него, чтобы привлечь внимание пользователя к необходимости вводить значение в эту ячейку.
  2. Если пользователь пытается ввести строку в ячейку для свойства value класса ClassB (который набирается как nullable long), фон ячейки должен загореться красным цветом, чтобы привлечь внимание пользователя, чтобы они не могли ввести строку значение в ячейку.

Я искал возможные пути для достижения этого, но все, что я нахожу, относится к WPF и относится к использованию DataTemplateSelector, которого нет в Silverlight.

Любая помощь?

ответ

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

пс: есть некоторые примеры в ASPX, но вы можете применить затем SilverLight, а также.

Удачи вам!

+0

Спасибо за ваш ответ. К сожалению, это не то, что ищет мой клиент. Я начал там, потому что это было очень простое решение, однако у клиента есть очень строгие требования к пользовательскому интерфейсу. Эти требования указаны в моем вопросе. Им нужна очень специфическая обратная связь, которую аннотации данных не предоставляют. – meyousikmann

Смежные вопросы