2011-04-14 1 views
1

둘 다 Silverlight DataGrid 내부의 콤보 박스를 사용하는 데 문제가 있습니다. 둘 다 DataContext에 바인딩되어 있고 RIA를 사용하여 데이터베이스에서 데이터를 검색합니다.Silverlight DataGrid with Comboboxes - 선택한 항목이 표시되지 않습니다.

내가 가진 문제는 콤보 상자에서 값을 선택하고 새로 선택한 값을 표시하는 셀이 아니라 셀을 클릭하면 셀이 비어있는 것으로 표시됩니다. 그러나 이것은 데이터 그릿의 다른 셀에서 아직 선택되지 않은 값을 선택하는 경우에만 발생합니다! 고유 한 값을 선택하면 상자가 다음과 같이

내 코드는 빈 표시됩니다 ..

<navigation:Page x:Class="Chemical_Management_System.EditPermissions" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 

     d:DesignWidth="640" d:DesignHeight="480" 
     Title="EditPermissions Page" Width="640" HorizontalAlignment="Center" 
      xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" 
      xmlns:my="clr-namespace:Chemical_Management_System.Web" 
      xmlns:myn="clr-namespace:Chemical_Management_System" 
      xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> 



<Grid x:Name="LayoutRoot"> 
    <Border BorderBrush="Silver" BorderThickness="1" Height="45" HorizontalAlignment="Left" Margin="10,10,0,0" Name="Border1" Style="{StaticResource HeaderBackground}" VerticalAlignment="Top" Width="618"> 
     <TextBlock Height="23" Name="TextBlock21" Style="{StaticResource HeaderText}" Text="Edit Permissions" /> 
    </Border> 
    <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:Permissions, CreateList=true}" Height="0" Name="PermissionsDomainDataSource" QueryName="GetPermissionsQuery" SubmittedChanges="OnSubmitChanges" Width="0"> 
     <riaControls:DomainDataSource.DomainContext> 
      <my:DataContext /> 
     </riaControls:DomainDataSource.DomainContext> 
    </riaControls:DomainDataSource> 

    <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:PermissionLookups, CreateList=true}" Height="0" Name="PermissionLookupsDomainDataSource" QueryName="GetPermissionLookupsQuery" Width="0"> 
     <riaControls:DomainDataSource.DomainContext> 
      <my:DataContext /> 
     </riaControls:DomainDataSource.DomainContext> 
    </riaControls:DomainDataSource> 

    <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:Users, CreateList=true}" Height="0" Name="UsersDomainDataSource" QueryName="GetUsersQuery" Width="0"> 
     <riaControls:DomainDataSource.DomainContext> 
      <my:DataContext /> 
     </riaControls:DomainDataSource.DomainContext> 
    </riaControls:DomainDataSource> 

    <Button Content="Apply" Height="23" HorizontalAlignment="Left" Margin="553,445,0,0" Name="btnApply" VerticalAlignment="Top" Width="75" /> 
    <sdk:DataGrid AutoGenerateColumns="False" Height="378" HorizontalAlignment="Left" ItemsSource="{Binding ElementName=PermissionsDomainDataSource, Path=Data}" Margin="12,61,0,0" Name="PermissionsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="615"> 
     <sdk:DataGrid.Columns> 

      <sdk:DataGridTemplateColumn Header="User" MinWidth="190"> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding User.Name}" Padding="5,0,0,0" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding UsersDomainDataSource}" 

            Loaded="ComboBoxUsers_Loaded" 
            SelectionChanged="UsersComboBox_SelectionChanged" 
           > 
          <ComboBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Name}" /> 
           </DataTemplate> 
          </ComboBox.ItemTemplate> 

         </ComboBox> 

        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn Header="Permission" MinWidth="175"> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding PermissionLookup.Description}" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding PermissionLookupsDomainDataSource}" 

            Loaded="ComboBox_Loaded" 
            SelectionChanged="PermissionLookupComboBox_SelectionChanged" 
           > 
          <ComboBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Description}" /> 
           </DataTemplate> 
          </ComboBox.ItemTemplate> 

         </ComboBox> 

        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTextColumn x:Name="DescriptionColumn" Binding="{Binding Path=Description}" Header="Description" MinWidth="245" /> 

     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
    <Button Content="New" Height="23" HorizontalAlignment="Left" Margin="12,445,0,0" Name="btnNew" VerticalAlignment="Top" Width="75" /> 
    <Button Content="Delete" Height="23" HorizontalAlignment="Left" Margin="93,445,0,0" Name="btnDelete" VerticalAlignment="Top" Width="75" /> 
    <Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="472,445,0,0" Name="btnCancel" VerticalAlignment="Top" Width="75" /> 
</Grid> 
다음

Partial Public Class EditPermissions 
Inherits Page 

Dim Context As New Web.DataContext() 
Dim user As New CurrentUser() 

Public Sub New() 
    InitializeComponent() 

    AddHandler user.userLoadedCompleted, AddressOf userLoaded 
End Sub 

'Executes when the user navigates to this page. 
Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs) 

End Sub 

Private Sub userLoaded() 
    If user.permissionCheck("Admin") = False Then 
     MessageBox.Show("You do not have permission to access this page") 
     NavigationService.Navigate(New Uri("/Home", UriKind.Relative)) 
    End If 
End Sub 

Private Sub PermissionsDomainDataSource_LoadedData(ByVal sender As System.Object, ByVal e As System.Windows.Controls.LoadedDataEventArgs) Handles PermissionsDomainDataSource.LoadedData 

    If e.HasError Then 
     System.Windows.MessageBox.Show(e.Error.ToString, "Load Error", System.Windows.MessageBoxButton.OK) 
     e.MarkErrorAsHandled() 
    End If 
End Sub 


Private Sub PermissionLookupsDomainDataSource_LoadedData(ByVal sender As System.Object, ByVal e As System.Windows.Controls.LoadedDataEventArgs) Handles PermissionLookupsDomainDataSource.LoadedData 

    If e.HasError Then 
     System.Windows.MessageBox.Show(e.Error.ToString, "Load Error", System.Windows.MessageBoxButton.OK) 
     e.MarkErrorAsHandled() 
    End If 
End Sub 

Private Sub ComboBox_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    ' set combobox items source from wherever you want 
    Dim combo As ComboBox = sender 
    combo.ItemsSource = Me.PermissionLookupsDomainDataSource.DataView 
End Sub 

Private Sub ComboBoxUsers_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    ' set combobox items source from wherever you want 
    Dim combo As ComboBox = sender 
    combo.ItemsSource = Me.UsersDomainDataSource.DataView 
End Sub 

Private Sub btnApply_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnApply.Click 
    Me.PermissionsDomainDataSource.SubmitChanges() 
    NavigationService.Navigate(New Uri("/AdminHome", UriKind.Relative)) 
End Sub 

Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnDelete.Click 
    If PermissionsDataGrid.SelectedItem IsNot Nothing Then 
     Dim selected As Web.Permissions = PermissionsDataGrid.SelectedItem 
     Me.PermissionsDomainDataSource.DataView.Remove(selected) 
    Else 
     MessageBox.Show("Please select a permission entry to delete") 
    End If 

End Sub 

Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnNew.Click 
    Dim permission As New Web.Permissions 
    Me.PermissionsDomainDataSource.DataView.Add(permission) 
End Sub 

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCancel.Click 
    Me.PermissionsDomainDataSource.RejectChanges() 
    NavigationService.Navigate(New Uri("/AdminHome", UriKind.Relative)) 
End Sub 

Private Sub OnSubmitChanges(ByVal sender As Object, ByVal e As SubmittedChangesEventArgs) 
    If (e.HasError) Then 
     MessageBox.Show("Error: " + e.Error.ToString) 
    End If 

End Sub 

Private Sub UsersComboBox_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) 

    Dim permission As Web.Permissions = PermissionsDataGrid.SelectedItem 
    Dim selected As ComboBox = sender 
    Dim user As Web.Users = selected.SelectedItem 

    permission.UserID = user.ID 
    selected.UpdateLayout() 
End Sub 

Private Sub PermissionLookupComboBox_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) 

    Dim permission As Web.Permissions = PermissionsDataGrid.SelectedItem 
    Dim selected As ComboBox = sender 
    Dim permissionLookup As Web.PermissionLookups = selected.SelectedItem 

    permission.PermissionID = permissionLookup.ID 

End Sub 
End Class 

답변

0

너도 알다시피, 나는이 문제에 오래 앉아서 할 수 있었다. 솔루션을 찾으십시오. 두 번째로 나는 그것을 온라인으로 게시한다 ... 그것은 나에게 나타난다. 그 일이 생길 때 나는 그것을 싫어한다. 어쨌든, 그 해결책은 다음과 같습니다.

데이터베이스 및 데이터 개체는 강력한 형식의 링크로 구성되므로 Permission.User.Property를 수행하여 특정 사용 권한 그룹에서 참조되는 사용자에게 액세스 할 수 있습니다. 이 Permission.User에 링크를 설정할 수도 있습니다.

이전에 DataDomainSources를 사용하여이 작업을 시도했지만 실제로 개체가 다른 DataDomainSources에 바인딩되었다는 오류가 발생했습니다. 이는 사용 권한을위한 DataDomainSources와 사용자 용 DataDomainSources가 하나씩 있기 때문입니다.

그러나이 제한은 DataContext를 사용할 때 존재하지 않지만 사용자와 권한이 동일한 DataContext에 존재하기 때문에 존재하지 않습니다.

<navigation:Page x:Class="Chemical_Management_System.EditPermissions" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 

     d:DesignWidth="640" d:DesignHeight="480" 
     Title="EditPermissions Page" Width="640" HorizontalAlignment="Center" 
      xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" 
      xmlns:my="clr-namespace:Chemical_Management_System.Web" 
      xmlns:myn="clr-namespace:Chemical_Management_System" 
      xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> 



<Grid x:Name="LayoutRoot" > 
    <Border BorderBrush="Silver" BorderThickness="1" Height="45" HorizontalAlignment="Left" Margin="10,10,0,0" Name="Border1" Style="{StaticResource HeaderBackground}" VerticalAlignment="Top" Width="618"> 
     <TextBlock Height="23" Name="TextBlock21" Style="{StaticResource HeaderText}" Text="Edit Permissions" /> 
    </Border> 


    <Button Content="Apply" Height="23" HorizontalAlignment="Left" Margin="553,445,0,0" Name="btnApply" VerticalAlignment="Top" Width="75" /> 
    <Button Content="New" Height="23" HorizontalAlignment="Left" Margin="12,445,0,0" Name="btnNew" VerticalAlignment="Top" Width="75" /> 
    <Button Content="Delete" Height="23" HorizontalAlignment="Left" Margin="93,445,0,0" Name="btnDelete" VerticalAlignment="Top" Width="75" /> 
    <Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="472,445,0,0" Name="btnCancel" VerticalAlignment="Top" Width="75" /> 
    <sdk:DataGrid AutoGenerateColumns="False" Height="364" HorizontalAlignment="Left" Margin="10,75,0,0" Name="dataGrid" VerticalAlignment="Top" Width="618" DataContext="dataContext.Permissions"> 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridTextColumn x:Name="DescriptionColumn" Binding="{Binding Path=Description}" Header="Description" MinWidth="245" /> 

      <sdk:DataGridTemplateColumn Header="User" MinWidth="190"> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding User.Name}" Padding="5,0,0,0" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 

       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox Loaded="UserComboBox_Loaded" SelectionChanged="UserComboBox_SelectionChanged"> 
          <ComboBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Name}" /> 
           </DataTemplate> 
          </ComboBox.ItemTemplate> 
         </ComboBox> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 


      </sdk:DataGridTemplateColumn> 

      <sdk:DataGridTemplateColumn Header="Permission" MinWidth="190"> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding PermissionLookup.Description}" Padding="5,0,0,0" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 

       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox Loaded="PermissionComboBox_Loaded" SelectionChanged="PermissionComboBox_SelectionChanged"> 
          <ComboBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Description}" /> 
           </DataTemplate> 
          </ComboBox.ItemTemplate> 
         </ComboBox> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 


      </sdk:DataGridTemplateColumn> 


     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
</Grid> 

Partial Public Class EditPermissions 
Inherits Page 

Dim Context As New Web.DataContext() 
Dim user As New CurrentUser() 


Public Sub New() 
    InitializeComponent() 

    AddHandler user.userLoadedCompleted, AddressOf userLoaded 

    Context.Load(Context.GetPermissionsQuery()) 
    Context.Load(Context.GetUsersQuery()) 
    Context.Load(Context.GetPermissionLookupsQuery) 


    dataGrid.ItemsSource = Context.Permissions 


End Sub 

'Executes when the user navigates to this page. 
Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs) 

End Sub 

Private Sub userLoaded() 
    If user.permissionCheck("Admin") = False Then 
     MessageBox.Show("You do not have permission to access this page") 
     NavigationService.Navigate(New Uri("/Home", UriKind.Relative)) 
    End If 
End Sub 





Private Sub UserComboBox_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    Dim combo As ComboBox = sender 
    combo.ItemsSource = Context.Users 
End Sub 

Private Sub UserComboBox_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) 
    Dim combo As ComboBox = sender 
    Dim user As Web.Users = combo.SelectedItem 

    Dim currentPermission As Web.Permissions = dataGrid.SelectedItem 
    currentPermission.User = user 

End Sub 


Private Sub PermissionComboBox_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    Dim combo As ComboBox = sender 
    combo.ItemsSource = Context.PermissionLookups 
End Sub 

Private Sub PermissionComboBox_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) 
    Dim combo As ComboBox = sender 
    Dim permissionLookup As Web.PermissionLookups = combo.SelectedItem 

    Dim currentPermission As Web.Permissions = dataGrid.SelectedItem 
    currentPermission.PermissionLookup = permissionLookup 

End Sub 

Private Sub btnApply_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnApply.Click 
    Context.SubmitChanges() 
End Sub 

Private Sub btnNew_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnNew.Click 
    Dim newpermission As New Web.Permissions 
    Context.Permissions.Add(newpermission) 
End Sub 


End Class 
을 다음과 같이

은 그래서 저는 코드를 다시 썼다