запускать все события, которые подписаны на определенный обработчик событий - PullRequest
0 голосов
/ 20 марта 2012

У меня есть просмотр списка

 <ListView Name="listView2">
        <ListView.View>
            <GridView>
                <!-- First Column -->
                <GridViewColumn Width="105" Header="ID">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>              
                            <StackPanel>    
                                      <!-- here is the event xID_Loaded -->    
                                <TextBox Loaded="xID_Loaded" Text="{Binding ID}"></TextBox>
                                <Popup Height="Auto"  Width="100" IsOpen="True" >
                                    <ListView Margin="2">
                                    </ListView>
                                </Popup>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <!-- Second Column -->
                <GridViewColumn Width="185" Header="Description">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Description}" ></TextBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
               etc...

В любом случае этот просмотр списка привязан к наблюдаемой коллекции.Я использую событие Loaded = "xID_Loaded" в столбце для инициализации всплывающего элемента управления каждый раз, когда я добавляю новую строку в просмотр списка.

Поэтому в моем коде есть:

private void xID_Loaded(object sender, RoutedEventArgs e)
{
    // sender is the textbox

    // I can get the popup relative to the sender
    var stackPanel = (StackPanel)(((Control)sender).Parent);
    var popup = return (Popup)sp.Children[1];

    // every time window moves I want to reset the location
    // of the popu by doing:
    this.LocationChanged += (a, b) =>
    {
        popup.IsOpen = false;   // this will ensure that the popup moves with the control
        popup.IsOpen = true;
    };

   // some more code to initialice the popup
   // ...

Теперь я хочу иметь метод с именем ResetAllPopups(), где этот метод будет сбрасывать все всплывающие окна.в случае, если кто-то прокручивает или по какой-либо причине я хочу сбросить все всплывающие окна.

Я знаю, что смогу решить эту проблему следующим образом:

перебирая элементы списка в представлении списка, находя всплывающий элемент управления с помощью VisualTreeHelper, затем сбрасывая каждое найденное всплывающее окно.

Я думаю, будет лучше, если я найду все события, которые подписаны на обработчик событий this.LocationChanged.Как я могу выполнить все события, которые подписаны на событие this.LocationChanged так же, как если бы я изменил расположение окна?

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Вы думаете, что слишком ориентированы на пользовательский интерфейс, просто привяжите IsOpen к вашим элементам, а затем итерируйте их, не нужно получать Popup экземпляр.

0 голосов
/ 20 марта 2012
    public event EventHandler reset_Popus;

    private void xID_Loaded(object sender, RoutedEventArgs e)
    {
        // I can get the popup relative to the sender
       var stackPanel = (StackPanel)(((Control)sender).Parent);
       var popup = return (Popup)sp.Children[1];


        Action<object,EventArgs> tempEvent = (object a, EventArgs b) =>
        {
            popup.IsOpen = false;
            popup.IsOpen = true;
        };

        reset_Popus += new EventHandler(tempEvent);
        this.LocationChanged += new EventHandler(tempEvent);
  }


  // finally the method that I needed
  public void ResetAllPopups()
  {
      foreach (var d in reset_Popus.GetInvocationList())
      {
          d.DynamicInvoke(null, null);
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...