これは問題です。オブジェクトにDataGrid
バインディングがあります。このオブジェクトを1要素で初期化しますが、DataGrid
は2行です。しかし、私のオブジェクトを見ると、彼はただ一つの行しか含んでいません。つまり、オブジェクトに接続されていない行が1つありますが、それは私のDataGrid
に表示されます。DataGrid:何もない理由で1行が表示される
コンテキストは次のとおりです。ユーザはCombobox内のアイテムでCriteria
を選択でき、コレクションUserCriteria
に保存されます。彼はボタンをクリックして行を追加できます。 UserCriteria
には行のインデックスが含まれているので、任意の基準を削除できます。しかし、この "奇妙な行"には索引がないので、この行を削除するとプログラムがクラッシュします。
私は追加ボタンなどでコードを表示しないことを選択しました。問題の一部ではないので、私は確信しています。
Search
をMainView
に接続すると問題があると思います。私は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"
を設定する必要が素敵な一日
これは完璧です!くそー、本当にありがとう!私はこの引数が 'Mode = TwoWay'を使えると思った。なぜこの余分な行が生成されるのか知っていますか? – Destunk
あなたを幸せにしてくれるよ –
新しい行を追加するのに役立つ余分な行が追加されました。最初の行で入力を開始すると、別の行が追加されます。これは、CanUserAddRows = "true"が設定されているときにデータグリッドが動作するデフォルトの方法です。このフラグはデフォルトではtrueです。この動作を避けたい場合は、このフラグをfalseに設定する必要があります。 –