Как выйти из метода и вернуть управление обратно пользователю, а не вызывающему методу? - PullRequest
3 голосов
/ 11 ноября 2010

У меня есть список и кнопка рядом с ним, которая использует выбранный элемент для выполнения действия. Если пользователь не делает выбор, но нажимает на кнопку, ему говорят сначала сделать выбор.

То, что у меня есть ниже, работает, но есть ли способ, при котором вызывающий метод не должен иметь оператор возврата if (not selected)? Я хочу просто вызвать метод selectionFound () из других событий, которые полагаются на просмотр списка? Я бы хотел, чтобы метод selectionFound выходил не только из себя, но и из вызывающего метода и возвращал управление пользователю. Поэтому вместо возврата true / false, как показано ниже, я хотел бы просто вернуть или любое другое ключевое слово.

private void deleteData()
{
 // if nothing selected, warn user and return control
 if(!selectionFound()) return;
        .....
}

private bool selectionFound()
{
 // make sure user selected an item from listview, warn and exit if not
 if (lvwInventory.SelectedIndex == -1)
 {
  MessageBox.Show("Please select an item first");
  return false;
 }
 else
  return true;
}

Ответы [ 6 ]

3 голосов
/ 11 ноября 2010

Помимо возврата флага в соответствии с вашим примером, самое близкое, что вы получите, - это сгенерировать исключение, поскольку это единственный известный мне механизм, который может перебрасывать кадры всего стека, не позволяя методам завершить выполнение. 1001 *

РЕДАКТИРОВАТЬ: И вы не должны использовать исключения для этой цели, поскольку они указывают, что произошло нечто исключительное.

2 голосов
/ 11 ноября 2010

Зачем даже вставлять это в код?В xaml вы можете отключить кнопку, если элемент не выбран.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ListView x:Name="listy">
        <ListViewItem>one
        </ListViewItem>
        <ListViewItem>two
        </ListViewItem>
        <ListViewItem>three
        </ListViewItem>
    </ListView>
    <Button Grid.Row="1" Content="Clicky">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItem, ElementName=listy}" Value="{x:Null}">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</Grid>
0 голосов
/ 11 ноября 2010

Вы можете использовать измененное событие listView для включения других элементов управления.Если ваша кнопка отключена по умолчанию, включите ее, когда событие listView change показывает, что пользователь что-то выбрал.Лично я все равно проверил бы значение, но вы могли бы быть достаточно уверены, что оно существует, если вы сделали это для события нажатия кнопки.

И в случае, если неясно, к чему я клоню, выможет устранить проверку для foundSelection () из вашего обработчика нажатий кнопок.

0 голосов
/ 11 ноября 2010

Я думаю, вы пытаетесь "угадать" фреймворк с помощью вашего метода selectionfound(). Я бы пересмотрел то, что у вас есть, на следующее:

private void deleteData()
{
 // if nothing selected, warn user and return control
 if(lvwInventory.SelectedIndex == -1)
 {
  MessageBox.Show("Please select an item first");
  return;
 }
 // Rest of function below...
}

Свойство SelectedIndex уже делает для вас (более или менее) то, что делал ваш метод selectionfound(). Просто найдите и отобразите в вашем методе deleteData () и просто сделайте return там, где хотите.

Единственная причина, по которой IMO этого не делает, - это если вы делаете это из 5 разных мест и всегда хотите один и тот же диалог или что-то еще. Тогда для меньшего дублирования кода вам понадобится код возврата, как и раньше.

0 голосов
/ 11 ноября 2010

Не думаю, что то, о чем вы просите, возможно без настроек ... Единственное, что мне приходит в голову, - это обернуть оставшуюся часть метода deleteData в делегат и передать его методу selectionFound в качестве параметра. Но это только испортит код.

0 голосов
/ 11 ноября 2010

Метод selectionFound () не будет иметь практического способа не допустить продолжения выполнения deleteData после его возврата;то, как вы это сделали, это то, как это должно быть сделано.

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

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