3

DataGrid(WPF Toolkit)でSelectedItemをバインドする際に問題が発生しました。メインフォームからUserControlを開くと、SelectedItemがDataGridに表示されません。しかし、デバッガーを見ると、すべてが問題なく、selecteditemには何らかの価値があります。次に、たとえば、値SelectedItemを(コードで)再度設定すると、DataGridはSelectedItemを正しく表示し始めます。

これが私のコードの一部です:

DictionaryView.xaml

<UserControl x:Class="AccountingCatridge.Views.DictionaryView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300" 
         xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit"
         DataContext="{Binding Source={StaticResource Locator}, Path=Dictionary}">
<Grid>
    <Label Content="{Binding Title}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="300" FontWeight="Bold" HorizontalContentAlignment="Center" FontSize="14" />
    <my:DataGrid x:Name="dataGrid"
                 Height="247" 
                 HorizontalAlignment="Left" 
                 Margin="0,53,0,0" 
                 VerticalAlignment="Top"
                 Width="300" 
                 IsReadOnly="True"
                 AutoGenerateColumns="False"
                 ItemsSource="{Binding DataItems}" 
                 SelectedItem="{Binding SelectedDictionaryItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                 HeadersVisibility="None">
        <my:DataGrid.Columns>
            <my:DataGridTextColumn Header="ID" Width="50" Binding="{Binding ID}" IsReadOnly="True"/>
            <my:DataGridTextColumn Header="Value" Width="*" Binding="{Binding Value}" IsReadOnly="True" />
        </my:DataGrid.Columns>

    </my:DataGrid>
    <ToolBarTray Height="26" HorizontalAlignment="Left" Margin="0,27,0,0" Name="toolBarTray1" VerticalAlignment="Top" Width="300" IsLocked="True">
        <ToolBar>
            <ToolBar.Items>
                <Button Content="Add" Command="{Binding AddElementCommand}"/>
                <Button Content="Edit" Command="{Binding EditElementCommand}"/>
                <Button Content="Delete" Command="{Binding DeleteElementsCommand}"/>
            </ToolBar.Items>
        </ToolBar>
    </ToolBarTray>
</Grid>

DictionaryViewModel

public DictionaryRecord SelectedDictionaryItem
{
    get { return _selectedDictionaryItem; }
    set
    {
        if (_selectedDictionaryItem == value) return;
        _selectedDictionaryItem = value;
        RaisePropertyChanged("SelectedDictionaryItem");
    }

}

public IEnumerable<DictionaryRecord> DataItems
{
    get { return _dataItems; } 
    set
    {
        if (_dataItems == value) return;
        _dataItems = value;
        RaisePropertyChanged("DataItems");
        SelectedDictionaryItem = _dataItems.First();
    }
}

public DictionaryViewModel(IDataService dataService)
{
    _dataService = dataService;
    Messenger.Default.Register<ShowDictionaryMessage>(this, ShowDictionary);
}

private void ShowDictionary(ShowDictionaryMessage mes)
{
    _typeDict = mes.TypeDict;
    Title = StringEnum.GetStringValue(_typeDict);

    switch (_typeDict)
    {
        case TypeDictionary.Employees:
            DataItems = _dataService.GetEmployees();
            break;
        case TypeDictionary.ModelPrinters:
            DataItems = _dataService.GetPrinters();
            break;
    }
}

もう少しコードと画像です。

    public RelayCommand EditElementCommand
        {
            get { return _editElementCommand ?? (_editElementCommand = new RelayCommand(EditElement)); }
        }

        private void EditElement()
        {
            if (SelectedDictionaryItem == null) return;
            Messenger.Default.Send(new ShowDictionaryRecordMessage{ Action = TypeRecordAction.Edit, Dictionary = _typeDict, Record = SelectedDictionaryItem});
        }

public RelayCommand SomeSimpleCommand
        {
            get { return _someSimpleCommand ?? (_someSimpleCommand = new RelayCommand(SomeSimpleAction)); }
        }

        private void SomeSimpleAction()
        {
            SelectedDictionaryItem = _dataItems.Last();
        }

ここでフォームを開くときに表示されます

.......。

しかし、SelectedDictionaryItemには価値があり、「編集」を押すと、必要なデータを含むフォームが正しく開きます。

SomeSimpleCommandを実行した場合。私は次のように見えます

.......。

最初のケースでSelectedItemに濃い青色の線が表示されない理由を知る必要があります。

PS私の悪い英語でごめんなさい。

4

1 に答える 1

0

dit: わかりました - 今何をしようとしているのかわかります...

過去に同様の問題がありましたが、それはサードパーティのコントロールでした。私が経験していたのは、データがグリッドにロードされる前に Selected アイテムが設定されていたことだと思います。

私は、グリッドのデータロードイベントで少しコードビハインドを使用して、少しごちゃごちゃする必要がありました。vm は、ViewModel への参照を格納するモジュール レベルの変数です。別の方法として、ロケーターを使用して自分のものを取得しているように見えるため、this.DataContext を ViewModel として取得することもできます。

 private void CaseGridView_DataLoaded(object sender, EventArgs e) 
    { 
        var grid = sender as GridView; 
        if (grid != null) 
        { 
            grid.SelectedItem = vm.CurrentlySelectedItem; 
        } 
    } 

試してみる価値のあるもう 1 つのことは、更新を確認するための UpdateLayout() です。

于 2012-10-10T12:55:08.410 に答える