0

これは、グリッド内のRichTextBoxに関する質問のフォローアップです。私はかなり遠くまで行きましたが、今はMVVMに変換する必要があります。タイプコンバータが呼び出されないため、問題はおそらくデータバインディングにあります。2つのデータグリッドを使用して、セットアップをより迅速にテストします。

ビューは、すべてのデータを含むViewModelを取得します。

<Window.Resources>
    <local:DifferenceToTextConverter  x:Key="DifferenceToTextConverter" />
    <DataTemplate x:Key="cellTemplate" DataType="{x:Type Label}">
        <Label Content="{Binding Converter={StaticResource ResourceKey=DifferenceToTextConverter}}" >
        </Label>
    </DataTemplate>
</Window.Resources>

        <DataGrid Name="TestGrid" 
                  ItemsSource="{Binding Source=DifferenceViewModel, Path=DifferenceData, Converter={StaticResource DifferenceToTextConverter}}" 
                  HeadersVisibility="Column"
                  ItemTemplate="{StaticResource cellTemplate}" >
        </DataGrid>
        </DataGrid>
        <DataGrid Name="OhterGrid" DataContext="{Binding ElementName=DifferenceViewModel, Path=DifferenceData}" HeadersVisibility="Column" >
            <DataGrid.ItemTemplate>
                <DataTemplate DataType="{x:Type Label}">
                    <Label Content="{Binding Converter={StaticResource ResourceKey=DifferenceToTextConverter}}" >
                    </Label>
                </DataTemplate>
            </DataGrid.ItemTemplate>
        </DataGrid>

    public DifferenceView(ViewModel.DifferenceViewModel differenceViewModel)
    {
        InitializeComponent();

        this.DifferenceViewModel = differenceViewModel;
    }

ViewModel、カスタムクラスのオブジェクトで満たされたDataTable。私はこれがそれを埋めるためのメソッドとしてデータを持っていることを知っています。そして、プロジェクトのルート名前空間にある私のコンバーター

namespace ViewModel
{
    public class DifferenceViewModel
    {
        private DataTable differenceData;

        /// <summary>
        /// Differences between properties.
        /// </summary>
        public DataTable DifferenceData
        {
            get
            {
                return this.differenceData;
            }
            private set
            {
                this.differenceData = value;
            }
        }
    }
}

class DifferenceToTextConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type sourceType, object parameter, System.Globalization.CultureInfo culture)
    {
        TextBlock cell = new TextBlock();

        // Convert custom data to text representation.

        return cell;
    }
}

制約:

  1. MVVMを使用する
  2. 可能な場合はxamlでスタイル設定します。
  3. 個々の文字にスタイルが適用されたテキスト。
  4. 列と行の数が不明です。
  5. カスタムタイプコンバーターは、セルテキスト全体を作成する必要があります。
4

1 に答える 1

1

問題はバインディングです。DataContextを正しく設定しておらず、データがロードされていないため、コンバーターが呼び出されていません。

2つの変更を加えます。まず、ビューDataContextDifferenceViewModel:に設定します。

public DifferenceView(ViewModel.DifferenceViewModel differenceViewModel)
{       
   this.DataContext = differenceViewModel;
   InitializeComponent();
}

次に、バインディングを変更します。
これの代わりに:

ItemsSource="{Binding Source=DifferenceViewModel, Path=DifferenceData, Converter={StaticResource DifferenceToTextConverter}}" 

これに変更します:

ItemsSource="{Binding DifferenceData, Converter={StaticResource DifferenceToTextConverter}}" 

これは基本的に次のことを意味します。

ItemsSource="{Binding Path=DifferenceData, Converter={StaticResource DifferenceToTextConverter}}" 

DataContextはDifferenceViewModelであるため、プロパティに直接移動しDifferenceDataます。これで、コンバーターにブレークポイントを設定できます。

于 2012-11-27T16:14:21.710 に答える