2013-09-26 55 views
0

我正在使用DataGrid控件編寫Silverlight 5 Web應用程序。我確實有一個有趣的問題。有關Silverlight sdk和子輸入中的DataGrid控件的問題C#

我爲每一行使用模板列。每行代表可觀察集合中的一個數據項。

每行包含一個複選框,一個文本塊和一個文本框。

我的錯誤發生的環境是其中有多行比silverlight可以在屏幕上繪製,因此使垂直scollbar。

當用戶向多個文本框和/或多個複選框輸入信息時,選中向下滾動的隨機框,隨機文本框中填入與先前填充的文本框類似的/部分的輸入。

當用戶向上滾動然後回落不同的行隨機填充。我已經嘗試了綁定和未綁定的輸入,結果是一樣的。

我嘲笑起來,顯示這個問題

這裏是MainPage.xaml中

<UserControl x:Class="DataGrid_bug_repro.MainPage" 
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" 
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" 
mc:Ignorable="d" 
d:DesignHeight="600" d:DesignWidth="800"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel> 
     <TextBlock Margin="60 0 0 0">Bound to Data Items</TextBlock> 
    <sdk:DataGrid Name="dgBound" Height="280" Width="680" AutoGenerateColumns="False" FontSize="12" > 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridTemplateColumn Header="Select" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <CheckBox Width="40" Tag="{Binding ID}" IsChecked="{Binding Selected}" /> 
         </StackPanel> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn Header="name" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <Grid> 
           <TextBlock TextWrapping="Wrap" Text="{Binding Name}" TextOptions.TextFormattingMode="Ideal" /> 
          </Grid> 
         </StackPanel> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn Header="txt" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <Grid> 
           <TextBox Text="{Binding txt}" /> 
          </Grid> 
         </StackPanel> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
     <TextBlock Margin="60 0 0 0">Not Bound to Data Items</TextBlock> 
    <sdk:DataGrid Name="dgNotBound" Height="280" Width="680" AutoGenerateColumns="False" FontSize="12" > 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridTemplateColumn Header="Select" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <CheckBox Width="40" Tag="{Binding ID}" /> 
         </StackPanel> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn Header="name" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <Grid> 
           <TextBlock TextWrapping="Wrap" Text="{Binding Name}" TextOptions.TextFormattingMode="Ideal" /> 
          </Grid> 
         </StackPanel> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn Header="txt" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <Grid> 
           <TextBox Text="" /> 
          </Grid> 
         </StackPanel> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
    </StackPanel> 
</Grid> 
</UserControl> 

這裏的XAML是用於MainPage.xaml.cs中文件的C#代碼的例子:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 

namespace DataGrid_bug_repro 
{ 
public class ITEM : INotifyPropertyChanged 
{ 
    private string _ID = string.Empty; 
    private bool _Selected = false; 
    private string _Name = string.Empty; 
    private string _txt = string.Empty; 

    public string ID 
    { 
     get{return _ID;} 
     set { _ID = value; onPropertyChanged(this, "ID"); } 
    } 

    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; onPropertyChanged(this, "Name"); } 
    } 

    public string txt 
    { 
     get { return _txt; } 
     set { _txt = value; onPropertyChanged(this, "txt"); } 
    } 

    public bool Selected 
    { 
     get { return _Selected; } 
     set { _Selected = value; onPropertyChanged(this, "Selected"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void onPropertyChanged(object sender, string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      PropertyChanged(sender, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    } 
    public partial class MainPage : UserControl 
    { 
    public MainPage() 
    { 
     ObservableCollection<ITEM> Items = new ObservableCollection<ITEM> { 
           new ITEM { ID="1", Name="Gomez" }, 
           new ITEM { ID="2", Name="Morticia" }, 
           new ITEM { ID="3", Name="Pugsly" }, 
           new ITEM { ID="4", Name="Wednesday" }, 
           new ITEM { ID="5", Name="Pubert" }, 
           new ITEM { ID="6", Name="Uncle Fester" }, 
           new ITEM { ID="7", Name="Grandmama" }, 
           new ITEM { ID="8", Name="Thing" }, 
           new ITEM { ID="9", Name="Lurch" }, 
           new ITEM { ID="10", Name="Cousin Itt" }, 
           new ITEM { ID="11", Name="Cousin Cackle" }, 
           new ITEM { ID="12", Name="Kitty Cat" }, 
           new ITEM { ID="13", Name="Aristotle" }, 
           new ITEM { ID="14", Name="Homer" }, 
           new ITEM { ID="15", Name="Tristan" }, 
           new ITEM { ID="16", Name="Isolde" }, 
           new ITEM { ID="17", Name="Zelda" }, 
           new ITEM { ID="18", Name="Cleopatra" }, 
           new ITEM { ID="19", Name="Bernice" }, 
           new ITEM { ID="20", Name="Ophelia" }, 
           new ITEM { ID="21", Name="Melancholia" }, 
           new ITEM { ID="22", Name="Hester" }, 
           new ITEM { ID="23", Name="Norman Normanmeyers" }, 
           new ITEM { ID="24", Name="Normina Normanmeyers" }, 
           new ITEM { ID="25", Name="N.J. Normanmeyers" }  }; 
     InitializeComponent(); 

     dgBound.ItemsSource = Items; 
     dgNotBound.ItemsSource = Items; 
    } 
} 
} 

有沒有人見過這個?有沒有解決辦法?我錯過了明顯的東西嗎?

感謝提前:)

回答

0

我已經在過去也曾經有過這樣的問題,我不記得確切如何解決它。但是,看代碼,這可能是它:

嘗試在你的代碼添加事件處理程序背後IsKeyboardFocusWithinChanged在像這樣,

private void DataGrid_IsKeyboardFocusWithinChanged(object sender,  System.Windows.DependencyPropertyChangedEventArgs e) 
{ 
     (sender as DataGrid).CommitEdit(DataGridEditingUnit.Row, true); 
} 

如果這也不行,我會刪除我的答案。

+0

不幸的是,事件不適用於我。看起來這個事件不容易被Control類型的繼承者使用。我確實嘗試了類似的方法,附加了文本更改偵聽器,並獲得了使用標誌設置場景的焦點偵聽器。這不起作用,因爲文本更改事件從未在用戶未觸及的行上觸發,但所有行都已填充。不過這是個好主意。絕對是我沒有想到的東西。 – ATM

+0

@AndrewTM是的,我的WPF解決方案。你必須意識到這個問題可能是由行虛擬化(重用控件)引起的。但是,你會認爲它應該默認工作......你有能力在Silverlight中禁用行虛擬化嗎? EnableRowVirtualization = 「假」?我至少會試試看看它是否會影響問題 – Alan

+0

我沒有選擇將其關閉。它在那裏,但它是隻讀的。 – ATM

0

事實證明,使用雙向綁定模式實際上可以使此問題無效。我不確定爲什麼,但它可能與行可視化有關。我只是想讓你們都知道周圍的工作。