2

コレクションに基づいて行を表示する(そして実行時に座標を更新し、実行時にコレクションに基づいて行を追加/削除する)グラフィカルな部分をUserControlに配置したいと思います。

Class1というクラスがあるとしましょう。

public class Class1 : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, e);
        }

        private int _x1 = 0;
        public int X1
        {
            get { return _x1; }
            set
            {
                _x1 = value;
                OnPropertyChanged(new PropertyChangedEventArgs("X1"));
            }
        }
    }

そして、私のUserControlのObservableCollection:

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, e);
        }

        private ObservableCollection<Class1> _classes = new ObservableCollection<Class1>();
        public ObservableCollection<Class1> Classes
        {
            get { return _classes; }
        }

行数がわかっている場合は、次のようにUserControlに行数を作成できます。

XAML:

<Grid DataContext="{Binding ElementName=LayoutRoot}">
<Line X1="{Binding Items[0].X1}" X2="100" Y1="50" Y2="100" Stroke="Red" StrokeThickness="4"/>
<Line X1="{Binding Items[1].X1}" ... />
...
</Grid>

どうすればいいですか?

努力してくれてありがとう

4

2 に答える 2

2

を使用してオブジェクトItemsControlのを作成し、をにバインドできます。DataTemplateClass1ObservableCollectionItemsControl

いたるところに線を引きたい場合はCanvas、として使用することもお勧めしますItemsPanelTemplate

簡単な例を次に示します。

Xaml:

<Grid DataContext="{Binding ElementName=UI}">
    <ItemsControl ItemsSource="{Binding Classes}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type local:Class1}">
                <Line Stroke="Black" StrokeThickness="2" Fill="Black" X1="{Binding X1}" X2="{Binding X2}" Y1="{Binding Y1}" Y2="{Binding Y2}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

コード:

public partial class MainWindow : Window
{

    public MainWindow() 
    {
        InitializeComponent();
        Random ran = new Random();
        for (int i = 0; i < 10; i++)
        {
            Classes.Add(new Class1 { X1 = ran.Next(0,100), Y1 = ran.Next(0,100), X2 = ran.Next(0,100), Y2 = ran.Next(0,100) }); 
        }
    }

    private ObservableCollection<Class1> _classes = new ObservableCollection<Class1>();
    public ObservableCollection<Class1> Classes
    {
        get { return _classes; }
    }

}

結果:

ここに画像の説明を入力してください

于 2013-03-15T07:10:59.000 に答える
1

コンテナとしてItemsControlを使用して、行を表示できます。

<ItemsControl DataContext="{Binding ElementName=LayoutRoot}" 
              ItemsSource={Binding}>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Line X1="{Binding Items[0].X1}" X2="100" Y1="50" Y2="100" Stroke="Red" StrokeThickness="4"/>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
于 2013-03-15T07:09:10.873 に答える