У меня есть MainWindow.xaml файл:WPF привязка данных: CollectionViewSource и ObjectDataProvider вопрос
<Window.Resources>
<CollectionViewSource x:Key="cvs"
Source="{Binding Source={StaticResource ResourceKey=DetailsCollection}}" />
<CollectionViewSource x:Key="DetailScopes">
<CollectionViewSource.Source>
<ObjectDataProvider
MethodName="GetValues"
ObjectType="{x:Type system:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="entities:DetailScope" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</CollectionViewSource.Source>
</CollectionViewSource>
<DataTemplate x:Key="AccountDetail"
DataType="{x:Type entities:AccountDetail}">
<DockPanel>
<ComboBox
DockPanel.Dock="Left"
ItemsSource="{Binding Source={StaticResource ResourceKey=DetailScopes}}"
SelectedItem="{Binding Path=Scope}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Converter={StaticResource DetailScopeConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBox Text="{Binding Path=Value}" />
</DockPanel>
</DataTemplate>
</Window.Resources>
...
<ListBox
ItemTemplate="{StaticResource ResourceKey=AccountDetail}"
ItemsSource="{Binding Source={StaticResource ResourceKey=cvs}}" />
и его код-за класс, в котором я определил фильтр для детализации областей:
public class MainWindow
{
public MainWindow()
{
CollectionViewSource detailScopes;
InitializeComponent();
// Attach filter to the collection view source
detailScopes = this.Resources["DetailScopes"] as CollectionViewSource;
detailScopes.Filter += new FilterEventHandler(DetailScopesFilter);
private void DetailScopesFilter(object sender, FilterEventArgs e)
{
DetailScope scope;
scope = (DetailScope)e.Item;
if (scope == DetailScope.Private ||
scope == DetailScope.Business)
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
}
}
Далее , есть AccountDetail
класс:
public class AccountDetail
{
public string Value
{
get { return this.value; }
set { this.value = value; }
}
public DetailScope Scope
{
get { return scope; }
set { scope = value; }
}
private string value;
private DetailScope scope;
}
Наконец, перечисление:
public enum DetailScope
{
Private,
Business,
Other
}
Когда я запускаю мой код, я получаю окно списка населенное с кучей деталей счетов, каждый из которых имеют свой собственное поле со списком с выбранной областью и текстовым полем с соответствующим значением. Проблема в том, что все выбранные значения в комбинированных ячейках соответствуют объему, заданному для последней введенной детали, и изменению любого из значений со списком всех их обновлений, как будто все они связаны с одной и той же деталью учетной записи.
Когда я вынуть ObjectDataProvider
из CollectionViewSource
DetailScopes и связать его непосредственно, проблема исчезла коробка комбо ItemsSource
в DataTemplate
AccountDetail. Тем не менее, мне нужно это внутри CollectionViewSource
, потому что я применяю к нему некоторую фильтрацию, и я не могу применить фильтрацию к ObjectDataProvider
.
Не могли бы вы объяснить, почему это происходит, и как я на самом деле должен подключаться CollectionViewSource
и ObjectDataProvider
? Спасибо.
Спасибо, что решила проблему. Также это вызвало другое: мой фильтр больше не работает. Он выполняется, но, похоже, он не применяется к выборам со списком. Есть идеи? – Boris 2010-12-01 11:20:42