当用户选择一行时,检查是否可以选择该行(不能事先进行检查)。如果不允许用户选择该行,则必须选择前一行。它是 WPF MVVM 应用程序。
如果我中止数据绑定属性中的选择,DataGrid上的SelectedItem属性将设置为先前的值,但它不会反映在GUI中。
这是使用MVVM-light模板重新创建的ViewModel代码。
public class MainViewModel : ViewModelBase
{
public MainViewModel(IDataService dataService)
{
List<MyItem> myItems = new List<MyItem>{
new MyItem {ID = 1, Text = "First"},
new MyItem {ID = 2, Text = "Second"},
new MyItem {ID = 3, Text = "Third"}
};
MyItems = new ObservableCollection<MyItem>(myItems);
}
public const string MyItemsPropertyName = "MyItems";
private ObservableCollection<MyItem> _myItems = null;
public ObservableCollection<MyItem> MyItems
{
get
{
return _myItems;
}
set
{
if (_myItems == value)
{
return;
}
_myItems = value;
RaisePropertyChanged(() => MyItems);
}
}
public const string MySelectedItemPropertyName = "MySelectedItem";
private MyItem _mySelectedItem = null;
public MyItem MySelectedItem
{
get
{
return _mySelectedItem;
}
set
{
var newValue = value;
//Do check...
if (value.ID == 2)
{
newValue = _mySelectedItem;
}
Set(() => MySelectedItem, ref _mySelectedItem, newValue);
}
}
}
这是xaml代码。如您所见,Label在DataGrid上显示SelectedItem上的Text-property,它不会数据绑定到ViewModel。
<StackPanel x:Name="LayoutRoot">
<DataGrid Name="MyGrid" AlternatingRowBackground="Gainsboro" ItemsSource="{Binding MyItems}"
SelectionMode="Single" SelectionUnit="FullRow" IsSynchronizedWithCurrentItem="True"
CanUserAddRows="false" CanUserDeleteRows="false" CanUserReorderColumns="False" CanUserSortColumns="False"
SelectedItem="{Binding MySelectedItem, Mode=TwoWay}"
AutoGenerateColumns="False">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Blue" />
<Setter Property="BorderThickness" Value="2" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
<DataGridTextColumn Header="Text" Binding="{Binding Text}"/>
</DataGrid.Columns>
</DataGrid>
<Label Content="{Binding ElementName=MyGrid, Path=SelectedItem.Text}"></Label>
</StackPanel>
如何更新DataGrid的GUI以使其与SelectedItem-property匹配? I. e。应突出显示上一行。
答案 0 :(得分:0)
你在MySelectedItem&#39;上错过了RaisePropertyChanged
吗?我无法想到还有什么问题,因为你的解决方案似乎没问题。
您可能需要尝试不同的方法:您可以使用RoutedCommand
和Blend Interactivity库中的InvokeCommandAction
绑定CallMethodAction
。
<DataGrid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding Path=SelectionChangedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>