3

はじめに

さまざまな DataSources のプールがあります。私はマスクを持っています。マスクにはインデックスラインがあります。各インデックスラインには、関連付けられたプールからの単一の DataSource があります。

クラス

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イベントに設定されている私のサンプル データWindowです。

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"},
};

XAML

そして、これが私のウィンドウの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}"/>

                        </DataTemplate>                        
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>

でマスクを選択するとListBox、すべてのインデックスラインが に表示されますDataGrid。これまでのところすべて順調です。DataSourceから選択したことがわかっている場合、それはオブジェクトComboBoxに保存されません。Indexline(マスクを切り替えてから元に戻すと、選択が失われます。また、デバッガーを使用すると、 の がすべて null であることがわかりSelectedDatasourceますMask

コードのユーザー インターフェイスを示す画像

質問

この動作の原因は何ですか? 期待されるものを得るには何を変更する必要がありますか?


誰かがより良いタイトルを提案できますか? 現在のものはあまり役に立たないように感じます:(

4

1 に答える 1

2

私は原因を見つけました:

sプロパティのデフォルトUpdateSourceTriggerはのようです。明示的に設定すると、問題が解決します! とても簡単!ComboBoxSelectedItemExplicitPropertyChanged

これが新しい完全な 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> 
于 2012-09-28T13:01:09.130 に答える