문제

저는 현재 Silverlight(Beta 2) Datagrid 컨트롤을 사용하고 있습니다.SelectionChanged 이벤트를 연결하기 전에는 헤더를 클릭하면 그리드가 완벽하게 정렬되었습니다.이제 그리드를 클릭하면 정렬할 헤더를 클릭하면 SelectionChanged 이벤트가 발생합니다.이 문제를 해결할 방법이 있나요?

준관련 주제에서는 이미 선택한 항목을 클릭할 때 SelectionChanged 이벤트가 실행되도록 하고 싶습니다(그래서 사용자가 선택한 값을 편집할 수 있도록 팝업이 발생하도록 할 수 있음).지금은 다른 값을 클릭한 다음 원하는 값으로 돌아가야 팝업이 표시됩니다.다른 방법이 있나요?

내 코드가 포함되어 있습니다.

그 페이지:

<UserControl x:Class="WebServicesApp.Page"
xmlns="http://schemas.microsoft.com/client/2007" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
Width="1280" Height="1024" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0" x:Name="OurStack" Orientation="Vertical" Margin="5,5,5,5">
        <ContentControl VerticalAlignment="Center" HorizontalAlignment="Center">
            <StackPanel x:Name="SearchStackPanel" Orientation="Horizontal" Margin="5,5,5,5">
                <TextBlock x:Name="SearchEmail" HorizontalAlignment="Stretch" VerticalAlignment="Center" Text="Email Address:" Margin="5,5,5,5" />
                <TextBox x:Name="InputText" HorizontalAlignment="Stretch" VerticalAlignment="Center" Width="150" Height="Auto" Margin="5,5,5,5"/>
                <Button x:Name="SearchButton" Content="Search" Click="CallServiceButton_Click" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Height="Auto" Background="#FFAFAFAF" Margin="5,5,5,5"/>
            </StackPanel>               
        </ContentControl>
<Grid x:Name="DisplayRoot" Background="White" ShowGridLines="True"
                HorizontalAlignment="Center" VerticalAlignment="Center" MaxHeight="300" MinHeight="100" MaxWidth="800" MinWidth="200"
                ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">
<data:DataGrid ItemsSource="{Binding ''}" CanUserReorderColumns="False" CanUserResizeColumns="False"  
                           AutoGenerateColumns="False" AlternatingRowBackground="#FFAFAFAF" SelectionMode="Single" 
                           HorizontalAlignment="Center"  VerticalAlignment="Center" Margin="5,5,5,5" x:Name="IncidentGrid" SelectionChanged="IncidentGrid_SelectionChanged">
                <data:DataGrid.Columns>
                    <data:DataGridTextColumn DisplayMemberBinding="{Binding Address}" Header="Email Address" IsReadOnly="True"  /> <!--Width="150"-->
                    <data:DataGridTextColumn DisplayMemberBinding="{Binding whereClause}" Header="Where Clause" IsReadOnly="True"  /> <!--Width="500"--> 
                    <data:DataGridTextColumn DisplayMemberBinding="{Binding Enabled}" Header="Enabled" IsReadOnly="True"  />
</data:DataGrid.Columns>
            </data:DataGrid>
        </Grid>
    </StackPanel>
    <Grid x:Name="EditPersonPopupGrid" Visibility="Collapsed">
        <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.765" Fill="#FF8A8A8A" />
        <Border CornerRadius="30" Background="#FF2D1DCC" Width="700" Height="400" HorizontalAlignment="Center" VerticalAlignment="Center" BorderThickness="1,1,1,1" BorderBrush="#FF000000">
            <StackPanel x:Name="EditPersonStackPanel" Orientation="Vertical" Background="White" HorizontalAlignment="Center" VerticalAlignment="Center" Width="650" >
                <ContentControl>
                    <StackPanel x:Name="EmailEditStackPanel" Orientation="Horizontal">
                        <TextBlock Text="Email Address:" Width="200" Margin="5,0,5,0" />
                        <TextBox x:Name="EmailPopupTextBox" Width="200" />
                    </StackPanel>
                </ContentControl>
                <ContentControl>
                    <StackPanel x:Name="AppliesToDropdownStackPanel" Orientation="Horizontal" Margin="2,2,2,0">
                        <TextBlock Text="Don't send when update was done by:" />
                        <StackPanel Orientation="Vertical" MaxHeight="275" MaxWidth="350" >
                            <TextBlock x:Name="SelectedItemTextBlock" TextAlignment="Right" Width="200" Margin="5,0,5,0" />
                            <Grid x:Name="UserDropDownGrid" MaxHeight="75" MaxWidth="200" Visibility="Collapsed" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Hidden" >
                                <Rectangle Fill="White" />
                                <Border Background="White">
                                    <ListBox x:Name="UsersListBox" SelectionChanged="UsersListBox_SelectionChanged" ItemsSource="{Binding UserID}" />
                                </Border>                                       
                            </Grid>
                        </StackPanel>
                        <Button x:Name="DropDownButton" Click="DropDownButton_Click" VerticalAlignment="Top" Width="25" Height="25">
                            <Path Height="10" Width="10" Fill="#FF000000" Stretch="Fill" Stroke="#FF000000" Data="M514.66669,354 L542.16669,354 L527.74988,368.41684 z" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="1,1,1,1"/>
                        </Button>
                    </StackPanel>
                </ContentControl>
                <TextBlock Text="Where Clause Condition:" />
                <TextBox x:Name="WhereClauseTextBox" Height="200" Width="800" AcceptsReturn="True" TextWrapping="Wrap" />
                <ContentControl>
                    <StackPanel Orientation="Vertical">
                        <StackPanel Orientation="Horizontal">
                            <Button x:Name="TestConditionButton" Content="Test Condition" Margin="5,5,5,5" Click="TestConditionButton_Click" />
                            <Button x:Name="Save" Content="Save" HorizontalAlignment="Right" Margin="5,5,5,5" Click="Save_Click" />
                            <Button x:Name="Cancel" Content="Cancel" HorizontalAlignment="Right" Margin="5,5,5,5" Click="Cancel_Click" />                       
                        </StackPanel>   
                        <TextBlock x:Name="TestContitionResults" Visibility="Collapsed" />
                    </StackPanel>
                </ContentControl>
            </StackPanel>               
        </Border>               
    </Grid>     
</Grid>

그리고 그리드의 선택이 변경될 때 발생하는 호출은 다음과 같습니다.

Private Sub IncidentGrid_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

    If mFirstTime Then
        mFirstTime = False
    Else
        Dim data As SimpleASMX.EMailMonitor = CType(IncidentGrid.SelectedItem, SimpleASMX.EMailMonitor)
        Dim selectedGridItem As SimpleASMX.EMailMonitor = Nothing
        If IncidentGrid.SelectedItem IsNot Nothing Then
            selectedGridItem = CType(IncidentGrid.SelectedItem, SimpleASMX.EMailMonitor)
            EmailPopupTextBox.Text = selectedGridItem.Address
            SelectedItemTextBlock.Text = selectedGridItem.AppliesToUserID
            WhereClauseTextBox.Text = selectedGridItem.whereClause
            IncidentGrid.SelectedIndex = mEmailMonitorData.IndexOf(selectedGridItem)
        End If
        If IncidentGrid.SelectedIndex > -1 Then
            EditPersonPopupGrid.Visibility = Windows.Visibility.Visible
        Else
            EditPersonPopupGrid.Visibility = Windows.Visibility.Collapsed
        End If
    End If
End Sub

내 코드가 형편없다면 죄송합니다. 저는 아직 Silverlight를 배우고 있습니다.

도움이 되었습니까?

해결책

제가 보기엔 Silverlight 버그인 것 같습니다.방금 시도해봤는데 제 쪽에서 무슨 일이 일어나고 있는지 선택이 변경되었습니다. 열 머리글을 클릭하면 이벤트가 두 번 발생하고 설상가상으로 선택한 항목의 색인이 현재 선택한 항목과 동기화된 상태를 유지하지 않습니다.

SelectionChanged가 처음 실행될 때 DataGrid의 값이 발생한다는 지식을 사용하여 문제를 해결하는 것이 좋습니다. 선택된항목 재산은 될 것입니다 없는

최소한 문제가 있는 몇 가지 샘플 코드는 다음과 같습니다.당신의 선택이 변경되었습니다. 논리는 들어갈 수 있다 만약에 절.

public partial class Page : UserControl
{
    private Person _currentSelectedPerson;

    public Page()
    {
        InitializeComponent();

        List<Person> persons = new List<Person>();
        persons.Add(new Person() { Age = 5, Name = "Tom" });
        persons.Add(new Person() { Age = 3, Name = "Lisa" });
        persons.Add(new Person() { Age = 4, Name = "Sam" });

        dg.ItemsSource = persons;
    }       

    private void SelectionChanged(object sender, EventArgs e)
    {
        DataGrid grid = sender as DataGrid;
        if (grid.SelectedItem != null)
        {
            _currentSelectedPerson = grid.SelectedItem as Person;
        }
        else
        {
            grid.SelectedItem = _currentSelectedPerson;
        }
    }
 }

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

다른 팁

언급한 첫 번째 문제(리조트에서 선택 변경 이벤트가 시작됨)에 대한 버그 수정이 있습니다.

Microsoft 패치는 다음 URL을 참조하세요.

http://www.microsoft.com/downloads/details.aspx?familyid=084A1BB2-0078-4009-94EE-E659C6409DB0&displaylang=en

이것은 효과가 있었지만 이제 두 번 정렬하면 첫 번째 항목에서 정렬된 다음 그리드의 첫 번째 선택된 항목으로 팝업이 표시됩니다.팝업 그리드를 닫은 다음 두 번째로 정렬을 시도하면 스택이 오버플로되고 Firefox가 충돌합니다.

시스템이 좀 더 안정될 때까지 Silverlight에서 작업하는 것을 다시 생각해야 할 수도 있다고 생각합니다.

답변 감사합니다 Hovito!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top