[英]Bind a TextBox to the selected value of a ComboBox in the DataTemplate of a ListView
我有一個看起來像這樣的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>
它正在工作,但是您必須在此解決方案的對象中添加屬性。
嘗試這個:
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>
ViewModel文件:
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; }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.