【问题标题】:Showing or hiding a control in WPF template based on bindings基于绑定在 WPF 模板中显示或隐藏控件
【发布时间】:2013-08-07 06:11:29
【问题描述】:

我是 WPF 绑定/模板的新手。我有一些关于模板化 TabControl 的基本问题,如下所示:

<TabControl x:Name="tcTabs" ItemsSource="{Binding Rooms, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Margin="5" BorderThickness="1" IsSynchronizedWithCurrentItem="True">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="{Binding Name}" />
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="130"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="22"/>
                            </Grid.RowDefinitions>

                            <ListBox Grid.Row="0" Grid.Column="0" BorderThickness="0" ItemsSource="{Binding Messages}" DisplayMemberPath="Raw" />
                            <ListBox Grid.Row="0" Grid.Column="1" BorderThickness="1,0,0,0" BorderBrush="#FFBBBBBB" ItemsSource="{Binding Users}" DisplayMemberPath="Nick" />
                            <TextBox Grid.Row="1" Grid.ColumnSpan="2" BorderThickness="0,1,0,0" BorderBrush="#FFBBBBBB" Height="22" />
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>

TabControl 在每个选项卡中包含 2 个列表框和一个文本框。包含用户名的列表框之一并非一直都是必需的。

有3种标签,服务器标签,房间标签和私人标签。在私人和服务器选项卡中,用户列表不应存在或隐藏。

我在绑定的房间对象上有一个枚举:

public enum IRCRoomType
{
    Server,
    Channel,
    Private
}
  1. 如何根据枚举自动隐藏用户列表,我已经看到了 2 种方法的示例,即使用转换器或触发器绑定可见性。哪种方法更好?还有更多方法吗?

  2. 当没有选项卡时,创建第一个选项卡时不会自动选择,如何选择?

  3. 是否有办法根据选项卡类型影响列表框中的项目样式?我将如何实现这一目标?

我只是在寻找链接/提示,而不是寻找实际的解决方案,但如果你能提供代码,那将是一个奖励!

【问题讨论】:

  • 在我看来,每个 WPF 开发人员都应该拥有一组有用的Converter 类,包括BoolToVisibilityConverter。在您的情况下,这听起来更像是 EnumToVisibilityconverter 可能更合适。

标签: wpf data-binding datatemplate tabcontrol


【解决方案1】:
  1. 这取决于代码的复杂程度。如果它很简单,我宁愿使用 Trigger(您拥有 XAML 中 UI 以下的所有内容),但如果代码更复杂,请考虑使用 Converters(实际上使用起来更简单)

  2. 绑定到List的SelectedIndex并设置为0?

  3. 是的,当然,您可以将ContentControlDataTemplate 一起使用(或者在某些情况下仅使用DataTemplate)我使用它的一些代码:

    <ListBox>
        <ListBox.Resources>
            <DataTemplate DataType="{x:Type your_namespace:your_type}">
                ... your code ...
            </DataTemplate>
    
            <DataTemplate DataType="{x:Type system:String}">
                ... your code ...
            </DataTemplate>
    
        </ListBox.Resources>
    </ListBox>
    

您发布的代码实际上是一个新的Template,但您更改了Style。请考虑覆盖一些Template

最好的问候

【讨论】:

  • 请您进一步解释一下“您发布的代码实际上是一个新模板,但您更改了样式。请考虑覆盖一些模板。”因为我想解决我的代码的任何问题。
  • "绑定到 List 的 SelectedIndex 并设置为 0?" -- 选项卡的源列表是一个可观察的 Room 对象集合,它没有 selectedIndex。
  • “是的,当然,您可以将 ContentControl 与 DataTemplate 一起使用(或者在某些情况下仅使用 DataTemplate)”——我认为您误解了我的问题。我的意思是可以根据选项卡是“服务器”还是选项卡是“通道”来更改列表中项目的样式。例如,“服务器”选项卡没有用户,因此不需要将列表格式化为左侧有用户名,而“频道”选项卡有。
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2015-12-08
  • 2012-07-19
  • 2018-01-14
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
相关资源
最近更新 更多