【发布时间】:2014-07-17 01:48:26
【问题描述】:
我有一个自定义的 ItemsControl,它(2 种方式)绑定到 ObservableCollection。每行有 1 个文本框和 2 个按钮,- 按钮将删除当前行,+ 按钮将插入一个新行,如下所示:
我的数据实体定义:
namespace SilverlightApplication1
{
using System.Collections.ObjectModel;
public class DeviceInfo
{
public DeviceInfo(string remarks)
{
this.Remarks = remarks;
}
public string Remarks { get; set; }
}
public class MainPageViewModel
{
public MainPageViewModel()
{
}
private ObservableCollection<DeviceInfo> devices = new ObservableCollection<DeviceInfo>();
public ObservableCollection<DeviceInfo> Devices
{
get
{
return this.devices;
}
set
{
this.devices = value;
}
}
}
}
这是我的 XAML 代码:
<Grid x:Name="LayoutRoot" Background="White">
<sdk:HeaderedItemsControl ItemsSource="{Binding Devices, Mode=TwoWay}" Margin="5, 5, 5, 5">
<sdk:HeaderedItemsControl.Template>
<ControlTemplate TargetType="sdk:HeaderedItemsControl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*" />
<ColumnDefinition Width="5*" />
<ColumnDefinition Width="5*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Margin="0, 0, 5, 10" HorizontalAlignment="Left" Text="Remarks"/>
<Grid Grid.Row="1" Grid.ColumnSpan="4" Width="Auto" Height="Auto" Background="White">
<ItemsPresenter/>
</Grid>
</Grid>
</ControlTemplate>
</sdk:HeaderedItemsControl.Template>
<sdk:HeaderedItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</sdk:HeaderedItemsControl.ItemsPanel>
<sdk:HeaderedItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="5*"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Text="{Binding Path=Remarks}" Margin ="0, 0, 10, 10"></TextBox>
<Button x:Name="Delete" Grid.Column="1" Margin="0, 0, 5, 10" Click="Delete_Click" Visibility="{Binding Path=Devices, Mode=TwoWay, Converter={StaticResource collectionElementCountToVisibilityConverter}}">-</Button>
<Button x:Name="Add" Grid.Column="2" Margin="0, 0, 5, 10" Click="Add_Click">+</Button>
</Grid>
</DataTemplate>
</sdk:HeaderedItemsControl.ItemTemplate>
</sdk:HeaderedItemsControl>
我有两个问题:
当用户单击 - 或 + 时,我想知道选择了哪个 DeviceInfo 元素,因此我可以删除该元素,或在其后面插入一个新元素,如何在按钮单击事件处理程序中获取该元素?
当集合中只有 1 个元素时,您可能会注意到 - 按钮是不可见的。我尝试将 - 按钮的 Visibility 属性绑定到 ItemsSource 集合,并在集合的计数为 1 时返回 Visibility.Collapse,但绑定不起作用,转换器从未被调用,我该怎么做才能使其工作?
提前致谢!
【问题讨论】:
-
我解决了第二个问题。绑定不起作用,因为 Button 它的 DataContext 是集合的元素,在我的例子中是 DeviceInfo 对象。它试图在“DeviceInfo”中找到一个名为“Devices”的属性当然失败了。我指定了数据上下文并且它有效:
-
或者这也有效:
标签: .net silverlight