我有一个不同的DataSource池。 我有面具。面具有索引线。每个Indexline都有一个来自相关池的数据源:
public class DataSource
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
public class Mask
{
public string Name { get; set; }
public ObservableCollection<Indexline> Indexlines { get; set; }
public override string ToString()
{
return Name;
}
}
public class Indexline
{
public DataSource SelectedDatasource { get; set; }
}
在我的MainWindow上,我有一些依赖属性(对它们没什么特别的):
ObservableCollection<DataSource>
)ObservableCollection<Mask>
)Mask
)这是我的示例数据,该数据在Loaded
的{{1}}事件中设置:
Window
这是我窗口的xaml代码:
this.AvalibleMasks = new ObservableCollection<Mask>()
{
new Mask()
{
Name = "Search Mask",
Indexlines = new ObservableCollection<Indexline>()
{
new Indexline(),
new Indexline(),
new Indexline(),
new Indexline(),
}
},
new Mask()
{
Name = "Document Mask",
Indexlines = new ObservableCollection<Indexline>()
{
new Indexline(),
new Indexline(),
}
}
};
this.AvalibleDataSources = new ObservableCollection<DataSource>()
{
new DataSource(){Name = "ERP Database"},
new DataSource(){Name = "CRM Database"},
};
我现在在<Window x:Class="DataSourcesQuestion.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="MainWindow_instance"
Title="MainWindow" Height="372" Width="735" Loaded="Window_Loaded">
<Grid>
<ListBox ItemsSource="{Binding AvalibleMasks}" SelectedItem="{Binding SelectedMask}" Margin="10,10,10,236" />
<DataGrid Margin="10,111,10,43" ItemsSource="{Binding SelectedMask.Indexlines}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Width="500" Header="Selected DataSource">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding AvalibleDataSources,Source={x:Reference MainWindow_instance}}"
SelectedItem="{Binding SelectedDatasource}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
中选择一个掩码,然后所有索引行都显示在ListBox
中。到目前为止一切都很好。当我知道从DataGrid
中选择DataSource
时,它将不会存储到ComboBox
对象中。 (因为当我切换掩码,然后切换回来时,选择消失了。当我使用调试器时,我可以看到Indexline
的{{1}}都是空的
这种行为的原因是什么?我需要做些什么改变来获得预期的?
有人可以提出更好的头衔吗?我觉得现在的那个不是很有用:(
答案 0 :(得分:2)
我找到了原因:
UpdateSourceTrigger
ComboBox
媒体资源的默认SelectedItem
似乎是Explicit
。
明确地将其设置为PropertyChanged
,解决了问题!太容易了!
那就是新的完整XAML代码
<Window x:Class="DataSourcesQuestion.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="MainWindow_instance"
Title="MainWindow" Height="372" Width="735" Loaded="Window_Loaded">
<Grid>
<ListBox ItemsSource="{Binding AvalibleMasks}" SelectedItem="{Binding SelectedMask}" Margin="10,10,10,236" />
<DataGrid Margin="10,111,10,43" ItemsSource="{Binding SelectedMask.Indexlines}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Width="500" Header="Selected DataSource">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding AvalibleDataSources,Source={x:Reference MainWindow_instance}}"
SelectedItem="{Binding SelectedDatasource, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>