说明正在发生的事情。基本上我有一个ListView绑定,它指向对象内的列表。在同一对象内(但不在列表内),我还有另一个列表,其中包含用于下拉列表的字符串,由于DataContext已设置为提到的第一个列表,因此我无法将其分配给列表视图。有人可以提供解决方案,还是更好却更有效的方式来处理此问题?
<ListView ItemsSource="{Binding myModel.myCollection}" Grid.Row="1" Grid.Column="0">
<ListView.View>
<GridView>
<GridViewColumn Header="Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Name, Mode=TwoWay}"></TextBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Category Tag">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding myModel.CategoryList}"></ComboBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
public class SiteUrlsModel : INotifyPropertyChanged
{
public string CaseName { get; set; }
public List<string> TestList => new List<string> { "Test1", "Test2", "Test3" };
public List<string> _categoryTagList;
public List<string> CategoryTagList
{
get => _categoryTagList;
set
{
if (_categoryTagList == value)
return;
_categoryTagList = value;
OnPropertyChanged();
}
}
private ObservableCollection<SiteUrlsModel> _myCollection;
public ObservableCollection<SiteUrlsModel> myCollection
{
get => _siteurlscCollection;
set
{
if (_siteurlscCollection == value)
return;
_siteurlscCollection = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
为简单起见,我已经排除了ViewModel和Code-Behind,但在 InitialiseComponent() 之后,我有了 DataContext = new TestViewModel() ,并且在我的ViewModel中,我有一个属性,该属性可创建我的Model的新实例,并添加吸气剂以确保所有内容均可访问。请放心,列表会被填充,我只是想分别填充一个下拉列表。
答案 0 :(得分:1)
之所以发生这种情况,是因为组合框的数据上下文将是myModel的项。
您需要明确告诉组合框从其父级的数据上下文中获取itemssource。
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.myModel.CategoryList, RelativeSource={RelativeSource AncestorType=DataGrid}}"></ComboBox>
</DataTemplate>