【发布时间】:2013-02-16 21:36:34
【问题描述】:
嘿,
我正在使用 MVVM 创建简单的应用程序,但偶然发现了一个我发现难以解决的问题。在我的应用程序中,我有数据网格和几个控件来编辑数据网格中当前选定的项目。在我的 ViewModel 中,我有 CurrentSequence 属性,其中包含 ColorSettingsSequencesSequence 对象(这些对象的集合用作数据网格的 DataContext)。
这里是 xaml:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=ColorSettingsSequences}"
SelectedItem="{Binding Path=CurrentSequence, Mode=TwoWay}">
.... more things here ...
</DataGrid>
<StackPanel Grid.Column="0" Grid.Row="0">
<Grid>
<Label Content="Start temperature (°C)" Height="28" HorizontalAlignment="Left" x:Name="lblSeqStartTemp" VerticalAlignment="Top" />
<TextBox Height="23" Margin="0,28,10,0" x:Name="tbSeqStartTemp" VerticalAlignment="Top" Text="{Binding Path=CurrentSequence.StartTemp}" />
</Grid>
<Grid>
<Label Content="Start color" Height="28" HorizontalAlignment="Left" x:Name="lblSeqHue" VerticalAlignment="Top" />
<xctk:ColorPicker Margin="0,28,10,0" x:Name="clrpSeqHue" SelectedColor="{Binding Path=CurrentSequence.StartHue, Converter={StaticResource hueToColor}, ConverterParameter=False}" ShowStandardColors="False" />
</Grid>
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="0">
<Grid>
<Label Content="End temperature (°C)" Height="28" HorizontalAlignment="Left" x:Name="lblSeqEndTemp" VerticalAlignment="Top" />
<TextBox Height="23" Margin="0,28,10,0" x:Name="tbSeqEndTemp" VerticalAlignment="Top" Text="{Binding Path=CurrentSequence.EndTemp}" />
</Grid>
<Grid>
<Label Content="End color" Height="28" HorizontalAlignment="Left" x:Name="lblSeqEndHue" VerticalAlignment="Top" />
<xctk:ColorPicker Margin="0,28,10,0" x:Name="clrpSeqEndHue" SelectedColor="{Binding Path=CurrentSequence.EndHue, Converter={StaticResource hueToColor}, ConverterParameter=False}" ShowStandardColors="False" />
</Grid>
</StackPanel>
代码:
private ColorSettingsSequencesSequence _currentSequence;
public ColorSettingsSequencesSequence CurrentSequence
{
get
{
return this._currentSequence;
}
set
{
this._currentSequence = value;
OnPropertyChanged("CurrentSequence");
}
}
这很好用,但是当我想添加验证时问题就来了。我想分别验证StartTemp 和EndTemp 并给出不同的错误。我将如何分解ColorSettingsSequencesSequence 对象,以便如果我编辑一个在数据网格中也得到更新的值,绑定也能正常工作?
这是我尝试过的,我创建了 2 个新属性并将我的验证添加到这些属性中:
private String _currentSequenceStartTemp;
public String CurrentSequenceStartTemp
{
get
{
return _currentSequenceStartTemp;
}
set
{
this._currentSequenceStartTemp = value;
CurrentSequence.StartTemp = value;
RaisePropertyChanged("CurrentSequenceStartTemp");
Validator.Validate(() => CurrentSequenceStartTemp);
ValidateCommand.Execute(null);
}
}
private String _currentSequenceEndTemp;
public String CurrentSequenceEndTemp
{
get
{
return _currentSequenceEndTemp;
}
set
{
this._currentSequenceEndTemp = value;
CurrentSequence.EndTemp = value;
RaisePropertyChanged("CurrentSequenceEndTemp");
Validator.Validate(() => CurrentSequenceEndTemp);
ValidateCommand.Execute(null);
}
}
我只是将 TextBoxes 绑定到这些值,而不是将它们直接绑定到 CurrentSequence。我还添加了在设置器中设置 CurrentSequence 值,并希望这样我的更改将一直推回原始集合并在数据网格中进行更改。那没有发生。。
当 CurrentSequence 改变时,我也会改变这些属性的值:
private ColorSettingsSequencesSequence _currentSequence;
public ColorSettingsSequencesSequence CurrentSequence
{
get
{
return this._currentSequence;
}
set
{
this._currentSequence = value;
RaisePropertyChanged("CurrentSequence");
if (value != null)
{
CurrentSequenceStartTemp = value.StartTemp;
CurrentSequenceEndTemp = value.EndTemp;
}
else
{
CurrentSequenceStartTemp = String.Empty;
CurrentSequenceEndTemp = String.Empty;
}
}
}
【问题讨论】:
-
好的,所以您的更改不会被推送到原始集合是吗?这是唯一的问题吗?
-
基本上是的,我需要分解对象,以便我可以将该对象的属性单独绑定到控件,以便我的验证工作。也许我的方法完全有缺陷并且不正确,所以我希望有人能告诉我这样做的正确方法是什么。
-
您在更改
CurrentSequenceEndTemp和CurrentSequenceStartTemp中的每个值后是否尝试使用RaisePropertyChanged("CurrentSequence");值得一试? -
@DanielWardin,是的,我试过了,没有帮助。
-
你的 ColorSettingsSequencesSequence 是否实现了 INotifyPropertyChanged?