2

これは単純なデータバインディングの問題だと思いますが、機能させることはできません。DataGrid、Observableコレクションを持つViewModel、およびこのコレクション内のオブジェクトを表すクラスがあります。DataGridには、DataGridTextColumnとDataGridTemplateColumnの2つの列があります。DataGridTextColumnとのデータのバインドは機能しますが、DataGridTemplateColumnとのバインドは機能しません。対応する列は単に空のままです。

コードは次のとおりです。

これは私のDataGridです:

<DataGrid x:Name="tdg_Memory" Grid.Column="1" Margin="0" Grid.Row="4" VerticalScrollBarVisibility="Visible" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="MemoryIndexColumn" Header="Index"/>
        <DataGridTemplateColumn x:Name="MemorySolutionColumn" CellTemplate="{DynamicResource MemorySolutionCellTemplate}" Header="Solution"/>
    <DataGrid.Columns>
<DataGrid>

これはDataTemplateです:

<DataTemplate x:Key="MemorySolutionCellTemplate">
    <Grid x:Name="grd_RootGrid" Height="Auto" Width="Auto" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Label x:Name="lbl_ValueCaption" Content="Value:" Margin="0" Grid.Row="0" Height="Auto" VerticalAlignment="Top" HorizontalAlignment="Right"/>
        <Label x:Name="lbl_FitnessCaption" Content="Fitness:" Margin="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Top"/>
        <Label x:Name="lbl_ValueValue" Content="65665" Grid.Column="1" Height="Auto" Margin="12,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
        <Label x:Name="lbl_FitnessValue" Content="121212" Grid.Column="1" Margin="12,0,0,0" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </Grid>
</DataTemplate>

データバインディングは、コードビハインドで発生します。

// setting the itemsSource (seems to work)
jobItem.tdg_Memory.ItemsSource = jobModel.Memory;

// binding of the first column (DataGridTextColumn) seems to work
Binding memoryIndexColumnBinding = new Binding();
memoryIndexColumnBinding.Path = new PropertyPath("Index");
jobItem.MemoryIndexColumn.Binding = memoryIndexColumnBinding;

そしてここにViewModelがあります:

// the observable collection that holds the data for the DataGrid
private ThreadSafeObservableCollection<MemoryItemRepresentative> _memory;

    public ThreadSafeObservableCollection<MemoryItemRepresentative> Memory {
        get { return _memory; }
        set {
            _memory = value;

            FirePropertyChanged("Memory");
        }
    }

コレクションに含まれるオブジェクトは次のとおりです。

public class MemoryItemRepresentative : ViewModelBase {

        private int _index;

        public int Index {
            get { return _index; }
            set {
                _index = value;

                FirePropertyChanged("Index");
            }
        }

        private MPBILSolution _solution;

        public MPBILSolution Solution {
            get { return _solution; }
            set {
                _solution = value;

                FirePropertyChanged("Solution");
            }
        }

        public MPBILPropabilityVector PropabilityVector;

        public MemoryItemRepresentative () {

        }
    }

そして、MBILSolutionは(しかし、それはその問題には無関係であるはずです):

public class MPBILSolution : ISolution {

    public int Position { get; set; }
    public BinaryNumber Value { get; set; }
    public double Fitness { get; set; }

}

ここで実行したいのは、DataGridの最初の列(DataGridTextColumn)をMemoryItemRepresentativeクラスのIndexプロパティにバインドすることです。これは正常に機能します。

さらに、2番目の列(DataGridTemplateColumn)にバインドされたMPBILSolutionオブジェクト(プロパティPosition、Value、Fitnessで構成される)のコンテンツを表示したいと思います。そのため、ValueプロパティのラベルとFitnessプロパティのラベルで構成されるDataTemplateを作成しました。

DataGridの対応する列が常に空のままであることが問題であると思われるため、機能していない実際のバインディングコードを投稿していません。少なくとも、DataTemplate内の静的ラベル(キャプションに使用される)が表示されている必要がありますか?

だから私はどんな助けにもとても感謝しています。リクエストに応じてそれ以上のコード...

付録:

さて、実際のバインディングで問題が発生するようです。DataGridで、列内にDataTemplateが表示されますが、MPBILSolutionオブジェクトの値が欠落しています。

このオブジェクトをDataTemplateにバインドする方法は次のとおりです。

DataTemplate memorySolutionCellTemplate = (DataTemplate)jobItem.FindResource("MemorySolutionCellTemplate");

        DependencyObject o = memorySolutionCellTemplate.LoadContent();

        Label l = (Label)VisualTreeAssistant.FindFrameworkElement(o, "lbl_FitnessValue");


        Binding fitnessValueBinding = new Binding();
        fitnessValueBinding.Path = new PropertyPath("Fitness");
        fitnessValueBinding.Mode = BindingMode.OneWay;
        l.SetBinding(Label.ContentProperty, fitnessValueBinding);

オブジェクトlは正しいLabelオブジェクトを取得しているように見えるので、問題はこのバインディングブロックの最後の4行にあるようです。

もう一度助けてください:)

4

1 に答える 1

1

なぜDynamicResourceですか?あなたがそうすることができるならばStaticResourceDynamicResource私が思うエラーについて静かにすることができます(おそらく出力ウィンドウをチェックしてください)...

于 2012-07-15T19:00:33.160 に答える