【问题标题】:In a DataTemplate, how to bind Visibility property to collection element count?在 DataTemplate 中,如何将 Visibility 属性绑定到集合元素计数?
【发布时间】: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>

我有两个问题:

  1. 当用户单击 - 或 + 时,我想知道选择了哪个 DeviceInfo 元素,因此我可以删除该元素,或在其后面插入一个新元素,如何在按钮单击事件处理程序中获取该元素?

  2. 当集合中只有 1 个元素时,您可能会注意到 - 按钮是不可见的。我尝试将 - 按钮的 Visibility 属性绑定到 ItemsSource 集合,并在集合的计数为 1 时返回 Visibility.Collapse,但绑定不起作用,转换器从未被调用,我该怎么做才能使其工作?

提前致谢!

【问题讨论】:

  • 我解决了第二个问题。绑定不起作用,因为 Button 它的 DataContext 是集合的元素,在我的例子中是 DeviceInfo 对象。它试图在“DeviceInfo”中找到一个名为“Devices”的属性当然失败了。我指定了数据上下文并且它有效:
  • 或者这也有效:

标签: .net silverlight


【解决方案1】:

对于第一个问题(因为您已经解决了第二个问题),您可以从按钮DataContext 中选择DeviceInfo,例如:

void Add_Click(object sender, RoutedEventArgs e)
{
    DeviceInfo selectedDeviceInfo = (DeviceInfo)((Button)sender).DataContext;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 2017-02-26
    • 2011-02-23
    • 2013-08-27
    • 2018-09-30
    • 2013-10-04
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多