2016-08-12 14 views
0

これは問題です。オブジェクトにDataGridバインディングがあります。このオブジェクトを1要素で初期化しますが、DataGridは2行です。しかし、私のオブジェクトを見ると、彼はただ一つの行しか含んでいません。つまり、オブジェクトに接続されていない行が1つありますが、それは私のDataGridに表示されます。DataGrid:何もない理由で1行が表示される

コンテキストは次のとおりです。ユーザはCombobox内のアイテムでCriteriaを選択でき、コレクションUserCriteriaに保存されます。彼はボタンをクリックして行を追加できます。 UserCriteriaには行のインデックスが含まれているので、任意の基準を削除できます。しかし、この "奇妙な行"には索引がないので、この行を削除するとプログラムがクラッシュします。

私は追加ボタンなどでコードを表示しないことを選択しました。問題の一部ではないので、私は確信しています。

SearchMainViewに接続すると問題があると思います。私はMVVMLight Toolkitを使用していますが、私は両方を接続する方法を理解していません。

マイSearchView(単にコンストラクタ):

public SearchView() 
    { 
     DataContext = SearchViewModel; 

     InitializeComponent(); 
    } 

マイSearchViewModel:

public static ObservableCollection<UserCriterion> UserCriteria 
    { 
     get { return _UserCriteria; } 
     set { _UserCriteria = value; } 
    } 

    // CONSTRUCTOR 
    public SearchViewModel() 
    { 
     // This is a list of Criteria 
     Criteria = Criterion.GetCriteriaUsuable(); 
     // In this function, I add one row to my Collection 
     UserCriteria = InitUserCriterionRow(); 
     // To create the DataContext 
     SearchView.SearchViewModel = this; 
    } 

マイSearchView XAML:

<Grid> 
     <DataGrid Name="CriteriaDataGrid" ItemsSource="{Binding UserCriteria, Mode=TwoWay}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 

       <!--COMBOBOX FOR ATTRIBUTES--> 
       <DataGridTemplateColumn Header="Criteria" Width="250" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox Width="235" SelectedItem="{Binding Path=DataContext.SearchViewModel.LastSelectedCriterion, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Mode=TwoWay}" 
             ItemsSource="{Binding Path=DataContext.SearchViewModel.Criteria, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Mode=TwoWay}" 
             IsEditable="True" DisplayMemberPath="Fullname" 
             HorizontalAlignment="Left"> 
          </ComboBox> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
</Grid> 

マイMainViewModel(MAINVIEWでSearchViewを持っています):

private ViewModelBase searchViewModel; 
    public ViewModelBase SearchViewModel 
    { 
     get { return searchViewModel; } 
     set 
     { 
      searchViewModel = value; 
      RaisePropertyChanged("SearchViewModel"); 
     } 
    } 

    /// <summary> 
    /// Initializes a new instance of the MainViewModel class. 
    /// </summary> 
    public MainViewModel(IDataService dataService) 
    { 
     _dataService = dataService; 
     _dataService.GetData(
      (item, error) => 
      { 
       if (error != null) 
       { 
        // Report error here 
        return; 
       } 

       WelcomeTitle = item.Title; 
      }); 
     SearchViewModel = SimpleIoc.Default.GetInstance<SearchViewModel>(); 
    } 

誰かが既にこの問題を抱えている場合は、私を助けてくれてうれしいです!

は、あなたがデータグリッドの定義とともにCanUserAddRows="false"を設定する必要が素敵な一日

答えて

2

を持っています。グリッドの下部に余分な行が生成されるのを防ぐのに役立ちます。グリッド定義は次のようになります。

<DataGrid Name="CriteriaDataGrid" 
      ItemsSource="{Binding UserCriteria, Mode=TwoWay}" 
      AutoGenerateColumns="False" 
      CanUserAddRows="false"> // You need to add this line 
+0

これは完璧です!くそー、本当にありがとう!私はこの引数が 'Mode = TwoWay'を使えると思った。なぜこの余分な行が生成されるのか知っていますか? – Destunk

+0

あなたを幸せにしてくれるよ –

+0

新しい行を追加するのに役立つ余分な行が追加されました。最初の行で入力を開始すると、別の行が追加されます。これは、CanUserAddRows = "true"が設定されているときにデータグリッドが動作するデフォルトの方法です。このフラグはデフォルトではtrueです。この動作を避けたい場合は、このフラグをfalseに設定する必要があります。 –

関連する問題