WPF绑定数据网格复选框

问题描述 投票:0回答:1

我是WPF编程新手...

我想从一个给定的列表中为每一个独特的应用程序用复选框填充DataGrid,技术人员可以为其选择的每一个设备选择应用程序,一旦他点击 "提交 "按钮......工具将为该设备创建一个csv,随后用于应用程序映射......

这是我的xaml。

$Appname = 'App1', 'App2', 'App3'
[xml]$xaml= @"
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Application Deployment Staging" Height="672.607" Width="905.517">
   <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="368*"/>
            <ColumnDefinition Width="425*"/>
        </Grid.ColumnDefinitions>
        <TextBox Name="TXTDeviceName" HorizontalAlignment="Left" Height="22" Margin="81,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="194"/>
        <GroupBox Name="Grpbx01" Header="Enter Device Name" HorizontalAlignment="Left" Height="70" Margin="33,16,0,0" VerticalAlignment="Top" Width="310" FontWeight="Bold"/>
        <GroupBox Name="Grpbx02" Header="Available Applications" HorizontalAlignment="Left" Height="456" Margin="34,100,0,0" VerticalAlignment="Top" Width="810" Grid.ColumnSpan="2">
            <DataGrid Name="Datagrd1" HorizontalAlignment="Left" Height="412" Margin="9,16,0,0" VerticalAlignment="Top" Width="776">
                <DataGrid.Columns>



                 </DataGrid.Columns>
             </DataGrid>
        </GroupBox>
        <Button Name="btn01" Content="Submit" Grid.Column="1" HorizontalAlignment="Left" Margin="226.4,578,0,0" VerticalAlignment="Top" Width="90" Height="27" FontWeight="Bold">
            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF77CAAB" Offset="0.771"/>
                    <GradientStop Color="#FFFAFAFA" Offset="0.003"/>
                </LinearGradientBrush>
            </Button.Background>
        </Button>
        <Button Name="btn02" Content="Cancel" Grid.Column="1" HorizontalAlignment="Left" Margin="337.4,576,0,0" VerticalAlignment="Top" Width="90" Height="27" FontWeight="Bold">
            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF98B1A8" Offset="0.771"/>
                    <GradientStop Color="#FFFAFAFA" Offset="0.003"/>
                </LinearGradientBrush>
            </Button.Background>
        </Button>
    </Grid>
</Window>
"@

# Add assemblie
Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase, System.DirectoryServices, system.Drawing, System.Windows.Forms, WindowsFormsIntegration

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | %{ Set-Variable -Name "$($_.Name)" -Value $Form.FindName($_.Name) -ErrorAction Stop }

$Form.ShowDialog() | Out-Null
wpf datagrid
1个回答
0
投票

解决方案1

如果我对你的问题理解正确的话,你需要添加一个类,如 我的申请列表 起初。这里有一个例子。

public class MyApplicationList
{
    public bool IsSelected { get; set; }
    public string ApplicationName { get; set; }
}

然后你在你的代码中创建一个公共属性。ObservableCollection (它是一个列表)。

public ObservableCollection<MyApplicationList> ItemList { get; set; }

现在为列表创建条目,并将它们添加到数据网格中。

public partial class MainWindow : Window
{
    ...
    public ObservableCollection<MyApplicationList> ItemList { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        ItemList = new ObservableCollection<MyApplicationList>();
        ItemList.Add(new MyApplicationList { ApplicationName = "App 1" });
        ItemList.Add(new MyApplicationList { ApplicationName = "App 2" });
        ItemList.Add(new MyApplicationList { ApplicationName = "App 3" });

        Datagrd1.ItemsSource = ItemList;
    }
    ...
}

在XAML代码中,你将修改以下内容: 数据网格 至此。

<DataGrid x:Name="Datagrd1" 
          HorizontalAlignment="Left" 
          Margin="9,16,0,0" 
          VerticalAlignment="Top"
          AutoGenerateColumns="False"
          CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding IsSelected}"/>
        <DataGridTextColumn Binding="{Binding ApplicationName}" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

最后一步是将一个事件添加到: 提交 按钮。

<Button Name="btn01" 
        Content="Submit" 
        HorizontalAlignment="Left"
        Margin="5,0,5,0" 
        VerticalAlignment="Top" 
        Width="90" 
        Height="27" 
        FontWeight="Bold"
        Click="btn01_Click">
    <Button.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FF77CAAB" Offset="0.771"/>
            <GradientStop Color="#FFFAFAFA" Offset="0.003"/>
        </LinearGradientBrush>
    </Button.Background>
</Button>

在事件处理程序中,你可以检查用户选择了什么。

private void btn01_Click(object sender, RoutedEventArgs e)
{
    // Her you can check what the user has selectet and save in a file
    // Get the items from the ObservableCollection
}

作为一个初学者,这将是一种方法,希望可以理解。

解决方法2:在事件处理程序中,你可以检查用户选择的内容。

如果你会做得很好,你就把它实施为 MVVM-patter.然后你做这样的事情:创建一个新的类,如MainWindowViewModel.cs。

public class MainWindowViewModel : INotifyPropertyChanged
{
    public ObservableCollection<MyApplicationList> ItemList { get; set; }

    public MainWindowViewModel()
    {
        ItemList = new ObservableCollection<MyApplicationList>();
        ItemList.Add(new MyApplicationList { ApplicationName = "App 1" });
        ItemList.Add(new MyApplicationList { ApplicationName = "App 2" });
        ItemList.Add(new MyApplicationList { ApplicationName = "App 3" });
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

在该类的 主窗口 衬托 主窗口视图模型(MainWindowViewModel.cs数据上下文 属性。

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

现在绑定 ObservableCollectionMainWindow.xaml 到DataGrid中。

<DataGrid x:Name="Datagrd1" 
          HorizontalAlignment="Left" 
          Margin="9,16,0,0" 
          VerticalAlignment="Top"
          ItemsSource="{Binding ItemList}"
          AutoGenerateColumns="False"
          CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding IsSelected}"/>
        <DataGridTextColumn Binding="{Binding ApplicationName}" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

获取类中按钮的事件。在MainWindowViewModel.cs中,在后面的代码中添加一个属性,并将命令绑定到按钮上。在后面的代码中添加一个属性,并将命令绑定到按钮上。

public class MainWindowViewModel : INotifyPropertyChanged
{
    public ICommand SubmitButtonPress { get; set; }

    public MainWindowViewModel()
    {
        ...
        SubmitButtonPress = new RelayCommand(SubmitButtonPressExecute, o => true);
        ...
    }

    private void SubmitButtonPressExecute(object o)
    {
        // Her you can check what the user has selectet and save in a file
        // Get the items from the ObservableCollection
    }
}

她是一个喜欢为类的例子 中继指令(RelayCommand) (C#角)中的按钮添加命令。MainWindow.xaml:

...
<Button Name="btn01" 
        Content="Submit" 
        Command="{Binding SubmitButtonPress}"
        HorizontalAlignment="Left"                    
        Margin="5,0,5,0" 
        VerticalAlignment="Top" 
        Width="90" 
        Height="27" 
        FontWeight="Bold">
    <Button.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FF77CAAB" Offset="0.771"/>
            <GradientStop Color="#FFFAFAFA" Offset="0.003"/>
        </LinearGradientBrush>
    </Button.Background>
</Button>
...

我希望这能回答你的问题并有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.