2

データグリッド列を動的に作成する必要があり、C# コードで列を作成する必要があるシナリオに巻き込まれています。生成された列ごとに別のコード領域にチェックボックスがあります。チェックボックスは、特定の列を非表示にするか表示するかを決定します。チェックボックスは GameAttributes.Visible プロパティにバインドされています。ただし、DataGrid の Visibility プロパティは別の型です。BooleanToVisibilityConverter を使用してみましたが、コンパイル エラーが発生します (予想どおり)。この問題に対する効率的な回避策はありますか?

私が遭遇しているエラー:

Cannot implicitly convert type 'bool' to 'System.Windows.Visibility'    

編集:コンパイラ エラーは解決されましたが、バインディングが可視性のために機能していないようです。

XAML:

<DataGrid ItemsSource="{Binding}" 
              DockPanel.Dock="Top" 
              AutoGenerateColumns="False" 
              HorizontalAlignment="Stretch" 
              Name="GameDataGrid" 
              VerticalAlignment="Stretch" 
              CanUserAddRows="False" 
              CanUserDeleteRows="False" 
              CanUserResizeRows="False"
              IsReadOnly="True"
              >

意見:

GameAttributes.Add(new GameInfoAttributeViewModel() { Visible = true, Description = "Name", BindingName = "Name" });
GameAttributes.Add(new GameInfoAttributeViewModel() { Visible = false, Description = "Description", BindingName = "Description" });
GameAttributes.Add(new GameInfoAttributeViewModel() { Visible = false, Description = "Game Exists", BindingName = "GameExists" });
foreach (GameInfoAttributeViewModel attribute in GameAttributes)
{

    DataGridTextColumn column = new DataGridTextColumn
    {
        Header = attribute.Description,
        Binding = new Binding(attribute.BindingName),
    };

    Binding visibilityBinding = new Binding();
    visibilityBinding.Path = new PropertyPath("Visible");
    visibilityBinding.Source = attribute;
    visibilityBinding.Converter = new BooleanToVisibilityConverter();
    BindingOperations.SetBinding(column, VisibilityProperty, visibilityBinding);

    GameDataGrid.Columns.Add(column);

}

ビューモデル:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;

namespace DonsHyperspinListGenerator
{
    class GameInfoAttribute
    {
        public string Description { get; set; }
        public bool Visible { get; set; }
        public string BindingName { get; set; }
    }

    //todo: move to separate class
    class GameInfoAttributeViewModel : INotifyPropertyChanged
    {
        private GameInfoAttribute mGameInfo = new GameInfoAttribute();

        public string Description
        {
            get { return mGameInfo.Description; }
            set
            {
                if (mGameInfo.Description != value)
                {
                    mGameInfo.Description = value;
                    InvokePropertyChanged("Description");
                }
            }
        }

        public bool Visible
        {
            get { return mGameInfo.Visible; }
            set
            {
                if (mGameInfo.Visible != value)
                {
                    mGameInfo.Visible = value;
                    InvokePropertyChanged("Visible");
                }
            }
        }

        public string BindingName
        {
            get { return mGameInfo.BindingName; }
            set
            {
                if (mGameInfo.BindingName != value)
                {
                    mGameInfo.BindingName = value;
                    InvokePropertyChanged("BindingName");
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        private void InvokePropertyChanged(string propertyName)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            PropertyChangedEventHandler changed = PropertyChanged;
            if (changed != null) changed(this, e);
        }
    }
}
4

1 に答える 1

0

バインディングや値コンバーターとは関係ありません。あなたはこの任務を行っています:

Visibility = attribute.Visible

ビューで新しい列を作成します。

それはあなたのコンパイルエラーです。Visibility は System.Windows.Visibility であり、attribute.Visible は bool です。Visibility を bool に設定することはできません。とにかくこの値がバインディングを介して設定されている場合は、手動で設定する必要はありません (実際、バインディングがクリアされます)。

編集:

値コンバーターを使用するためにコード ビハインドでバインディングを設定する方法の例を次に示します。

var binding = new Binding();
binding.Source = attribute;
binding.Path = new PropertyPath("Visible");
binding.Converter = (BooleanToVisibilityConverter)Resources["BoolToVisibilityConverter"];

BindingOperations.SetBinding(column, DataGridTemplateColumn.VisibilityProperty, binding);

2 番目の編集: 上記のコードには、問題となる可能性があることがいくつかあります。

VisibilityPropertyまず、バインディングを設定するとき、DependencyProperty の" " だけにバインディングを設定しているように見えます。あなたの見解の文脈でそれが何であるかはわかりません(おそらくUserControl.VisibilityProperty、または何か)。設定したい特定の DependencyProperty は DataGridTemplateColumn タイプにあるため、DataGridTemplateColumn.VisibilityProperty代わりに設定する必要があると思います。

したがって、この行:BindingOperations.SetBinding(column, VisibilityProperty, visibilityBinding);

これになります:BindingOperations.SetBinding(column, DataGridTemplateColumn.VisibilityProperty, visibilityBinding);

もう 1 つのことは、DataGridTextColumn のオブジェクト初期化子の次の行です。

Binding = new Binding(attribute.BindingName),

その行で何をしているのかわかりませんが、列の全体的な DataContext で問題が発生している可能性があります (これにより、Visibility バインディングで問題が発生する可能性があります)。それが問題であるとは確信していませんが、Visibility Binding の設定には絶対に必要ありません。回答で提供したコードをサンプル プロジェクトで動作させ、上記で提供したすべての行を追加しました (コンパイル エラーの原因となった列初期化子の割り当てを削除した後)。

于 2012-05-14T02:24:51.860 に答える