Я очень новичок в 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>
У меня есть два требования к пользовательскому интерфейсу:
- Если какое-либо из свойств значения в ClassB имеет значение NULL, ячейка сетки данных, представляющая это нулевое значение, должна иметь красную рамку вокруг него, чтобы привлечь внимание пользователя к необходимости вводить значение в эту ячейку.
- Если пользователь пытается ввести строку в ячейку для свойства value класса ClassB (который набирается как nullable long), фон ячейки должен загореться красным цветом, чтобы привлечь внимание пользователя, чтобы они не могли ввести строку значение в ячейку.
Я искал возможные пути для достижения этого, но все, что я нахожу, относится к WPF и относится к использованию DataTemplateSelector, которого нет в Silverlight.
Любая помощь?
Спасибо за ваш ответ. К сожалению, это не то, что ищет мой клиент. Я начал там, потому что это было очень простое решение, однако у клиента есть очень строгие требования к пользовательскому интерфейсу. Эти требования указаны в моем вопросе. Им нужна очень специфическая обратная связь, которую аннотации данных не предоставляют. – meyousikmann