1

Groupboxをスタックパネルにバインドしたい。

c#:

internal ObservableCollection<GroupBox> BindingTest
{
    get
    {
        ObservableCollection<GroupBox> collection = new ObservableCollection<GroupBox>();
        for (int counter = 0; counter < 5; counter++)
        {
            GroupBox groupBox = new GroupBox();
            groupBox.Header = " ... Header ... ";
            groupBox.Content = " ... Content ... ";
            collection.Add(groupBox);
        }

            return collection;
    }
}

およびxamlコード:

<StackPanel x:Name="Dynamic" Grid.Row="1" Margin="29,118,6,0">
    <ItemsControl ItemsSource="{Binding Path=BindingTest}" Height="482">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <GroupBox>
                    <GroupBox.Header>{Binding Path=Header}</GroupBox.Header>
                    <GroupBox.Content>{Binding Path=Content}</GroupBox.Content>
                </GroupBox>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</StackPanel>

推論の誤りはどこにありますか?

4

2 に答える 2

1

WPFバインディングでは、通常、コントロールにバインドせず、オブジェクトにバインドして、マークアップにUIの詳細を処理させるだけです。理想的には、オブジェクトはINotifyPropertyChanged、プロパティの変更のバインディングを通知するために実装する必要があります。コントロールの作成は、によってすでに処理されています。コントロールはDataTemplateすでにを作成し、GroupBoxそのプロパティをバインディングで使用されるオブジェクトのプロパティにバインドします。

可能であればViewModel、UIについて何も知らないか、コントロールを使用する必要があります。MVVMパターンは、UIとデータ/ロジックを分離することを目的としています。

データオブジェクトのクラスは次のようになります。

public class DataObject : INotifyPropertyChanged
{
    private string header;
    private string content;

    public string Header {
        get { return header; }
        set { header = value; RaisePropertyChanged("Header"); }
    }

    public string Content {
        get { return content; }
        set { content= value; RaisePropertyChanged("Content"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        var handler = PropertyChanged;
        if (handler != null) { 
            handler(this, new PropertyChangedEventArgs(propertyName)); 
        }
    }
}

バインドするプロパティも異なって見えます:

internal ObservableCollection<DataObject> BindingTest
{
    get
    {
        ObservableCollection<DataObject> collection = new ObservableCollection<DataObject>();
        for (int counter = 0; counter < 5; counter++)
        {
            DataObject item = new DataObject ();
            item.Header = " ... Header ... ";
            item.Content = " ... Content ... ";
            collection.Add(item );
        }

            return collection;
    }
}

プロパティにアクセスするたびに新しいコレクションを作成するのは、テスト目的だけだと思います。

于 2012-06-22T07:19:27.717 に答える
0

BindingTestプロパティをフィールドに変更するだけpublicです。..データをUIに自動的にバインドします。..

基本的に、xamlを使用すると、internalやprivateなどの他のフィールドに制限があるため、パブリックプロパティをUIにバインドできます。

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }


        public ObservableCollection<GroupBox> BindingTest
        {
            get
            {
                ObservableCollection<GroupBox> collection = new ObservableCollection<GroupBox>();
                for (int counter = 0; counter < 5; counter++)
                {
                    GroupBox groupBox = new GroupBox();
                    groupBox.Header = " ... Header ... ";
                    groupBox.Content = " ... Content ... ";
                    collection.Add(groupBox);
                }

                return collection;
            }
        }
    }

次のようなxamlコード

<Grid >
        <StackPanel x:Name="Dynamic" >
            <ItemsControl ItemsSource="{Binding BindingTest, RelativeSource={RelativeSource AncestorType={x:Type this:MainWindow}}}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <GroupBox Header="{Binding Path=Header}"
                                  Content="{Binding Path=Content}">
                        </GroupBox>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </Grid>
于 2012-06-22T07:28:30.850 に答える