Свойство CurrentPosition не обновляется должным образом - PullRequest
0 голосов
/ 06 апреля 2011

Позвольте мне попробовать еще раз ... вот XAML.Вы можете увидеть CollectionViewSource, Grid, который использует его как DataContext, ListView и кнопку Delete.Происходит следующее: когда я щелкаю по строке в ListView (и срабатывает триггер Style, чтобы выбрать ListViewItem), выбирается строка.Когда я нажимаю кнопку «Удалить», запускается onclick, но свойство CurrentPosition устанавливается в -1.Что мешает обновлению свойства CurrentPosition.

XAML

<Window x:Class="PretzelsUI.Admin.Ovens"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="" 
    Height="344" 
    Width="474" 
    mc:Ignorable="d" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:my="clr-namespace:Pretzels.Model;assembly=Pretzels.Model"
    ResizeMode="NoResize"
    WindowStartupLocation="CenterOwner"
    Background="{StaticResource WindowGradient}"       
    Loaded="Window_Loaded">
<Window.Resources>
    <CollectionViewSource x:Key="ovenViewSource" d:DesignSource="{d:DesignInstance my:Oven, CreateList=True}" />
</Window.Resources>
<Grid DataContext="{StaticResource ovenViewSource}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Border Grid.Row="0" BorderBrush="{StaticResource formTitleBorderBrush}" BorderThickness="2" Name="border1" CornerRadius="30" Padding="7" Background="{StaticResource formTitleBackgroundBrush}" VerticalAlignment="Center" Margin="11">
        <TextBlock Name="textBlock1" Text="Ovens" FontSize="18" FontWeight="Bold" Foreground="{StaticResource formTitleForegroundBrush}" />
    </Border>
    <ListView IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Name="ovenListView" SelectionMode="Single" Height="177"  Grid.Row="1" TabIndex="2" Margin="5,5,5,0">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Control.HorizontalContentAlignment" Value="Stretch" />
                <Setter Property="Control.VerticalContentAlignment" Value="Stretch" />
                <!--<Style.Triggers>
                    <Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="IsSelected" Value="True" />
                    </Trigger>
                </Style.Triggers>-->
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>                    
                <GridViewColumn x:Name="nameColumn" Header="Name" Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Margin="-6,-1" Text="{Binding Path=OvenName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged}" Width="Auto" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn x:Name="descriptionColumn" Header="Description" Width="300">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Margin="-6,-1" Text="{Binding Path=OvenDescription, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" Width="Auto" MaxLength="100"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <StackPanel Grid.Row="2" Name="stackPanel2" Margin="0,30,0,0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
        <Button Content="New" Height="23"  Margin="2,0,2,0" TabIndex="3" Name="btnAdd" Width="75" Click="btnInsrt_Click" />
        <Button Content="Save" Height="23" Margin="2,0,2,0" TabIndex="4" Name="btnSave" Width="75" Click="btnSave_Click" />
        <Button Content="Delete" Height="23" Margin="2,0,2,0" TabIndex="5" Name="btndelete" Width="75" Click="btndelete_Click" />
    </StackPanel>
</Grid>

C #

 public partial class Ovens : Window
{
    private PretzelEntities dbcontext = new PretzelEntities();
    //private OvenCollection EntityData;
    private CollectionViewSource ViewSource;
    private BindingListCollectionView OvenView;

    public Ovens()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ViewSource = (CollectionViewSource)this.FindResource("ovenViewSource");

        ViewSource.Source = from s in dbcontext.Ovens select s;
        OvenView = (BindingListCollectionView)(ViewSource.View);
    }


    private void btndelete_Click(object sender, RoutedEventArgs e)
    {
            if (OvenView.CurrentPosition > -1)
            {
                if (MessageBox.Show("Do you really want to delete this Oven?", "Delete Confirmation", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                {
                    this.OvenView.RemoveAt(this.OvenView.CurrentPosition);
                }
            }
            else
            {
                MessageBox.Show("Nothing to Delete.", "Error", MessageBoxButton.OK);
            }
    }




enter code here

Я думаю, что происходит, когда триггер запускает CurrentItem / CurrentPositionListCollectionView не обновляется должным образом.Я не уверен, что нужно делать это (хотя я знаю доступные методы) вручную, когда я нажимаю на текстовое поле в одной из строк.Не уверен, что для этого я могу просто вручную найти выбранный ListViewItem с помощью VisualTreeHelper.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2011

Сделал некоторое тестирование, и проблема в триггере стиля.

<Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="IsSelected" Value="True" />
                    </Trigger>

Я использую триггер стиля, чтобы выбрать ListViewItem, когда я нажимаю на что-либо внутри ListViewItem (то есть TextBox / ComboBox). Когда этот триггер установлен, строка выбирает, если я выбираю TextBox, но CurrentPosition объекта ListCollectionView всегда равен -1. Если я удаляю триггер и фактически выбираю саму строку (щелкните за пределами текстового поля), то стрелка CurrentPosition установлена ​​правильно. Мой вопрос, почему ... мне нужно вручную установить CurrentPosition. Любая помощь приветствуется.

0 голосов
/ 07 апреля 2011

Я наконец отказался от триггера стиля и просто обработал событие GotFocus для текстового поля / комбинированного списка внутри строк ListView.В обработчике я смог получить ListViewItem и установить IsSelected в true.Работает как чемпион.

private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        Control ctrl = sender as Control;
        ContentPresenter cp = (ContentPresenter)ctrl.TemplatedParent;
        GridViewRowPresenter gp = (GridViewRowPresenter)cp.Parent;
        Grid g = (Grid)gp.Parent;
        ListViewItem lvi = (ListViewItem)g.TemplatedParent;
        lvi.IsSelected = true;
    }
0 голосов
/ 06 апреля 2011

ИМО, лучше все это настроить в коде так:

void InitializeDataContext()
{
    var ovens = (from s
                 in dbcontext.Ovens
                 select s).ToList();

    ICollectionView view = new CollectionViewSource
    {
        Source = ovens
    }.View;

    ViewSource = view;
    ovenListView.ItemsSource = ViewSource;
}

Вы можете вызвать этот метод в вашем Window_Loaded, исключить другой код в Window_Loaded, а затем устранить привязки, так как вы делаете все это уже в коде. Было бы лучше установить все это без какого-либо кода в представлении (MVVM), но это выходит за рамки контекста этого вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...