0

現在、コード ビハインドにコントロールを追加してから、ビジュアル ツリーをたどって値を取得しています。

<StackPanel Name="StackPanel1/>

Dim _TextBox As New TextBox()
StackPanel1.children.insert(index, _TextBox)

ユーザーが追加のテキスト ボックスをスタック パネルに追加するボタン クリック イベントがあります。

私は、itemscontrol の方が雄弁で、MVVM パターンにより適していると考えています。ユーザーがパネル内の任意のインデックスでテキストボックスを削除できるように設定する最良の方法がわかりません。削除することを選択したコントロールの適切なインデックスを取得するために、ツリーをたどる必要はありませんか? 現在、コントロールが追加されると、コントロールの横に削除ボタンが追加されます。その後、ツリーをたどってインデックスを取得できます。

4

1 に答える 1

0

それを行う1つの方法はDataTemplateItemsControl(あなたが言ったように)でを使用するDataTemplateことItemsControlです。CommandBindingsこれは簡単な例に過ぎず、追加したイベント ハンドラーの代わりに実装する必要があります。

サンプル コードは c# ですが、非常にシンプルで、簡単に変換できると確信しています。

Xaml:

    <Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="400" Name="UI" >

    <Window.Resources>
        <DataTemplate x:Key="itemTemplate" >
            <StackPanel Orientation="Horizontal">
                <TextBox x:Name="txtbx" Text="{Binding Value}" HorizontalAlignment="Left" Width="175"  />
                <Button Content="X" Width="{Binding ElementName=txtbx, Path=ActualHeight}"  HorizontalAlignment="Right" Click="Button_Click" Tag="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <ItemsControl ItemTemplate="{StaticResource itemTemplate}" Name="itemsControl" ItemsSource="{Binding ElementName=UI, Path=Models}" Margin="0,40,0,0" />
        <Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="3,8,0,0" Name="Button_Add" VerticalAlignment="Top" Width="75" Click="Button_Add_Click" />
    </Grid>
</Window>

コード:

public partial class MainWindow : Window
{
    private ObservableCollection<MyModel> _models = new ObservableCollection<MyModel>();

    public MainWindow()
    {
        InitializeComponent();
    }

    public ObservableCollection<MyModel> Models
    {
        get { return _models; }
        set { _models = value; }
    }

    private void Button_Add_Click(object sender, RoutedEventArgs e)
    {
        Models.Add(new MyModel());
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Models.Remove((sender as Button).Tag as MyModel);
    }
}

public  class MyModel : INotifyPropertyChanged
{
    private string _value;

    public string Value 
    {
        get { return _value; }
        set { _value = value; NotifyPropertyChanged("Value"); } 
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
于 2013-01-03T23:24:46.557 に答える