使用引用的ItemsSource绑定到SelectedItem

时间:2012-09-28 11:45:13

标签: c# wpf binding datacontext

简介

我有一个不同的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上,我有一些依赖属性(对它们没什么特别的):

  • AvalibleDataSources(ObservableCollection<DataSource>
  • AvalibleMasks(ObservableCollection<Mask>
  • SelectedMask(Mask

样本数据

这是我的示例数据,该数据在Loaded的{​​{1}}事件中设置:

Window

XAML

这是我窗口的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}}都是空的

Image showing the user interface of the code

问题

这种行为的原因是什么?我需要做些什么改变来获得预期的?


有人可以提出更好的头衔吗?我觉得现在的那个不是很有用:(

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>