防止选择DataGrid行。 GUI未更新

时间:2015-04-28 07:58:45

标签: c# wpf mvvm datagrid

当用户选择一行时,检查是否可以选择该行(不能事先进行检查)。如果不允许用户选择该行,则必须选择前一行。它是 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。应突出显示上一行。

1 个答案:

答案 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>