1

次のような ListView があります。

ここに画像の説明を入力

コンボ ボックスは、TfsTask 型のオブジェクトの ObservableCollection にバインドされます。ユーザーが選択を変更したときに、同じ行のコントロールに、コンボ ボックスで選択した項目に含まれるデータを入力したいと考えています。たとえば、タスク「テスト」に特定の期間値と別の残りの値があるとします。ユーザーがコンボ ボックスでこのタスクを選択した場合、行のコントロールにこれらの値を入力したいと思います。

質問は次のとおりです。他の列のコントロールをコンボ ボックスの選択された項目にバインドするにはどうすればよいですか。コントロールに直接バインドする場合、その ElementName を使用してそれを行うことができますが、DataTemplate ではどのように行うのでしょうか?

XAML で ListView を定義する方法を次に示します。例として、 [タスク] コンボ ボックスと [期間]テキスト ボックスのみを配置しました。

<ListView MinHeight="100" Name="m_taskList">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="140" Header="Task" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Grid HorizontalAlignment="Stretch">
                            <ComboBox Name="m_taskName" DisplayMemberPath="Name" SelectedValue="{Binding Path=TaskId, Mode=TwoWay}" SelectedValuePath="Id" ItemsSource="{Binding ElementName=This, Path=TfsTasks}/>
                        </Grid>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="140" Header="Duration" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Grid >
                            <TextBox Text="{Binding ????}" />
                        </Grid>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <!-- .... -->
        </GridView>
    </ListView.View>
</ListView>
4

1 に答える 1

1

機能していますが、このソリューションではオブジェクトにプロパティを追加する必要があります。

これを試して:

XAML ファイル:

<Window x:Class="ListViewCombo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView MinHeight="100" Name="m_taskList" ItemsSource="{Binding Path=MyItems}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="140" Header="Task" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Grid HorizontalAlignment="Stretch">
                                    <ComboBox Name="m_taskName" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedItem}" SelectedValuePath="ID" ItemsSource="{Binding Path=Items}" />
                                </Grid>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="140" Header="Duration" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Grid >
                            <TextBox MinWidth="150" Text="{Binding Path=SelectedItem.Duration}" />
                        </Grid>
                    </DataTemplate>
                 </GridViewColumn.CellTemplate>
             </GridViewColumn>                   
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
</Window>

ビューモデル ファイル:

using System.Collections.ObjectModel;
using Microsoft.Practices.Prism.ViewModel;

namespace ListViewCombo
{
    class MainViewModel : NotificationObject
    {
        public MainViewModel()
        {
            for (int i = 0; i < 3; i++)
            {
                ObservableCollection<Task> Source = new ObservableCollection<Task>();
                for (int j = 0; j < 5; j++)
                {
                    Source.Add(new Task { ID = i, Name = "Name_" + i, Duration = (i + 2) * 6 + (3 * j) });
                }
                MyItems.Add(new TfsTask { ID = i, Items = Source });
            }                        
        }

        private ObservableCollection<TfsTask> _myItems = new ObservableCollection<TfsTask>();
        public ObservableCollection<TfsTask> MyItems
        {
            get { return _myItems; }
            set { _myItems = value; RaisePropertyChanged(() => MyItems); }
        }    
    }

    public class Task
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Duration { get; set; }
    }

    public class TfsTask
    {
        public int ID { get; set; }
        public ObservableCollection<Task> Items { get; set; }
        public Task SelectedItem { get; set; }
    }
}
于 2012-07-31T18:12:10.043 に答える