c# - WPF ListView 与自定义类型和插入控件的绑定(bind)

标签 c# wpf listview binding

我正在制作聊天程序,并且我已经制作了API来连接服务器。

这是 API 的核心类

public partial class PengChat3ClientSock : IDisposable

嗯,PengChat3ClientSock 有一个 Rooms 属性。

public class Room
{
    public uint ID { get; private set; }

    public string Name { get; private set; }

    public string Master { get; internal set; }

    public short MaxConnectorNum { get; private set; }

    public bool IsNeedPassword { get; private set; }
}

这是一个 Rooms 属性

public Room[] Rooms { get; private set; }

现在是客户端,我有 ListView,它显示房间列表。

<ListView x:Name="listView_RoomList" Grid.Row="1" Grid.ColumnSpan="2">
</ListView>

我想像这样设计 ListView 。

RoomName Master MaxConnectorNum Password(If IsNeedPassword is true = Enable) EntryButton   DeleteButton(If Master is I = Enable)
Label    Label  Label           PasswordBox                                  Button        Button
Label    Label  Label           PasswordBox                                  Button        Button
Label    Label  Label           PasswordBox                                  Button        Button
Label    Label  Label           PasswordBox                                  Button        Button

顶部是标题。 我想插入这样的控件。

如果属性 Rooms 更改,我想自动更改此 ListView

是不是太难了?但我认为这是可能的。

感谢您的回答。

最佳答案

如果我没有误解你的问题,试试这个

Room.cs

public class Room
{
    public uint ID { get;  set; }

    public string Name { get;  set; }

    public string Master { get;  set; }

    public short MaxConnectorNum { get;  set; }

    public bool IsNeedPassword { get;  set; }
}

xaml

    <Window.Resources>
    <Style TargetType="{x:Type Button}" x:Key="deleteButtonStyle">
        <Setter Property="IsEnabled" Value="False"></Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Master}" Value="I">
                <DataTrigger.Setters>
                    <Setter Property="IsEnabled" Value="True"></Setter>
                </DataTrigger.Setters>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <ListView ItemsSource="{Binding Rooms}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="RoomName">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="Label"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Master">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="Label"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="MaxConnectorNum">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="Label"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Password">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <PasswordBox IsEnabled="{Binding IsNeedPassword }" MinWidth="100"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="EntryButton">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Button"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="DeleteButton">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Button" Style="{StaticResource deleteButtonStyle}">
                                </Button>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
</StackPanel>

xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext=new ViewModel();
    }
}

ViewModel

    public class ViewModel
{
    public ObservableCollection<Room> Rooms { get; set; }

    public ViewModel()
    {
        Rooms = new ObservableCollection<Room>() 
        {
            new Room(){Master="I",IsNeedPassword=false},
            new Room(){Master="I",IsNeedPassword=true},
            new Room(){Master="j",IsNeedPassword=false},
            new Room(){Master="k",IsNeedPassword=true}
        };
    }
}

output enter image description here

关于c# - WPF ListView 与自定义类型和插入控件的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626333/

相关文章:

c# - TcpClient在tcp流关闭之前不会将数据发送到Logstash

C#MVC : User Password Reset Controller: Issues with email addresses as usernames

c# - XAML 如何实例化对象?

WPF MVVM-Light 如何在ViewModel中使用传递的DragEventArgs

c# - ListView : InvalidArgument = Value of '0' is not valid for 'index' 中的错误

c# - 在另一个 session 中枚举用户桌面的 Windows

c# - 互操作后 Excel 进程保持打开状态;传统方法行不通

wpf - 在 Expression Blend 中执行 WPF 有哪些优势?

android - 为什么我的ListView是从下往上开始的?

android - 单击项目时,自定义 ListView 不会在第二个 Activity 中显示图像