小编Yae*_*ael的帖子

如何使用MVVM自动隐藏WPF中的DataGrid列?

使用MVVM(没有代码隐藏),我想在选择时隐藏我的DataGrid列,我有以下代码:

<DataGrid ItemsSource="{Binding SSID}" Grid.Row="1"  Margin="10,10,0,0" Height="200" Width="500" Grid.ColumnSpan="2" Name="dg" HorizontalAlignment="Left" AutoGenerateColumns="False">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Network ID" Binding="{Binding _networkID}"></DataGridTextColumn>
      <DataGridTextColumn Header="SSID" Binding="{Binding _ssid}"></DataGridTextColumn>
      <DataGridTextColumn Header="VLAN" Binding="{Binding _vlan}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _authenticationMode}" Binding="{Binding _authenticationMode}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _authentication}" Binding="{Binding _authentication}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _staticWEPKeyType}" Binding="{Binding _staticWEPKeyType}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _staticWEPKeyLength}" Binding="{Binding _staticWEPKeyLength}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _staticWEPKey1}" Binding="{Binding _staticWEPKey1}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _staticWEPKey2}" Binding="{Binding _staticWEPKey2}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _staticWEPKey3}" Binding="{Binding _staticWEPKey3}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _staticWEPKey4}" Binding="{Binding _staticWEPKey4}"></DataGridTextColumn>
      <DataGridTextColumn Visibility="{Binding _wpaPersonalKeyAC}" Binding="{Binding _wpaPersonalKeyAC}"></DataGridTextColumn>
   </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

C#代码是:

var ssid = new SSIDPropertyClass();

ssid._networkID …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml datagrid mvvm

20
推荐指数
2
解决办法
4万
查看次数

如何根据属性隐藏wpf datagrid列

我有以下WPF示例程序:

XAML:

<Window x:Class="AncestorArie.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis" />
    </Window.Resources>
    <Grid>
        <DataGrid AutoGenerateColumns="False" Name="Blumen" 
                  ItemsSource="{Binding Leaves}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Color}" 
                                    Header="Farbe" Width="160" />
                <DataGridTextColumn Binding="{Binding Size}" 
                                    Header="Größe" Width="60"
                                    Visibility="{Binding Path=DataContext.Flag, 
                                                RelativeSource={RelativeSource Findancestor, 
                                                AncestorType={x:Type Window}}, 
                                                Converter={StaticResource BoolToVis}}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

代码背后:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Flowers rose = new Flowers();
        rose.Leaves = new ObservableCollection<Leaf>();

        rose.Flag = false;

        Leaf L1 = new Leaf();
        L1.Color = "rot";
        L1.Size = 3; …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf xaml datagrid

19
推荐指数
2
解决办法
3万
查看次数

带有ComboBox绑定的WPF DataGridTemplateColumn(MVVM模式)

我正在使用以下WPF DataGrid + ComboBox方案来疯狂.

我有一组看起来像的课程;

class Owner
{
    int ID { get; }
    string Name { get; }

    public override ToString()
    { 
        return this.Name;
    }
}

class House
{
    int ID { get; }
    Owner HouseOwner { get; set; }
}

class ViewModel
{
    ObservableCollection<Owner> Owners;
    ObservableCollection<House> Houses
}
Run Code Online (Sandbox Code Playgroud)

现在我想要的结果是一个DataGrid,它显示了House类型的行列表,在其中一列中,是一个ComboBox,它允许用户更改House.HouseOwner的值.

在这种情况下,网格的DataContext是ViewModel.Houses,对于ComboBox,我希望ItemsSource绑定到ViewModel.Owners.

这甚至可能吗?我正在努力解决这个问题...我能做的最好的事情就是正确地绑定ItemsSource,但是ComboBox(在DataGridTemplateColumn中)没有在每一行中显示House.HouseOwner的正确值.

注意:如果我将ComboBox从图片中取出并将TextBlock放入DataTemplate中,我可以正确地看到每行的值,但同时获取ItemsSource以及在选择中显示正确的值对我来说不起作用...

里面的背后我的代码,我已经设置窗口在DataContext到视图模型和对电网的DataContext设置ViewModel.Houses.对于除这个组合框之外的所有东西,它正在工作......

我的XAML对于违规列看起来像;

<DataGridTemplateColumn Header="HouseOwner">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Path=DataContext.Owners, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                        DisplayMemberPath="Name"
                        SelectedItem="{Binding HouseOwner, RelativeSource={RelativeSource AncestorType={x:Type …
Run Code Online (Sandbox Code Playgroud)

wpf binding datagrid combobox datagridtemplatecolumn

11
推荐指数
2
解决办法
3万
查看次数

是否有可能在mvvm模式中获取wpf datagrid上的动态列?

我正在开发wpf(mvvm模式)的产品.我有一个场景,我已经花了一个多星期没有好结果.如果可以,请帮助我......这是场景,根据用户的自定义(用户ll选择列),我必须在datagrid中显示一组数据.目前我正在将带有一组属性的ObservableCollection绑定到datagrid的itemsource.这限制了我固定的列大小.注意:列出了n个列名称供用户选择.如果通过"datagrid.columns.add()"轻松完成后面的代码.在这种情况下,任何人都可以帮助我.

我的xaml:

<my:DataGrid AutoGenerateColumns="False" Margin="357,121.723,82,41" Name="dataGrid3" c:DataGridExtension.Columns="{Binding ColumnCollection}" />
Run Code Online (Sandbox Code Playgroud)

我的命令类:

public static class DataGridExtension
{
    public static ObservableCollection<DataGridColumn> GetColumns(DependencyObject obj)
    {
        return (ObservableCollection<DataGridColumn>)obj.GetValue(ColumnsProperty);
    }

    public static void SetColumns(DependencyObject obj, ObservableCollection<DataGridColumn> value)
    {
        obj.SetValue(ColumnsProperty, value);
    }

    public static readonly DependencyProperty ColumnsProperty = 
        DependencyProperty.RegisterAttached("Columns", typeof(ObservableCollection<DataGridColumn>),typeof(DataGridExtension),
         new UIPropertyMetadata (new ObservableCollection<DataGridColumn>(), OnDataGridColumnsPropertyChanged));

    private static void OnDataGridColumnsPropertyChanged(DependencyObject d,
           DependencyPropertyChangedEventArgs e)
    {
        if (d.GetType() == typeof(DataGrid))
        {
            DataGrid myGrid = d as DataGrid;

            ObservableCollection<DataGridColumn> Columns = (ObservableCollection<DataGridColumn>)e.NewValue;

            if (Columns != null)
            {
                myGrid.Columns.Clear();

                if (Columns != …
Run Code Online (Sandbox Code Playgroud)

c# wpf datagrid mvvm

11
推荐指数
1
解决办法
2万
查看次数

当datagrid-cell获得焦点时自动编辑WPF数据网格内容

我在WPF中有一个带有DataGridTextColumDataGridTemplateColum的数据网格.

<DataGridTextColumn Width="4*" IsReadOnly="True" x:Name="dataGridColumnDescription" 
Header="Description" Binding="{Binding Description}">
</DataGridTextColumn>

<DataGridTemplateColumn CellStyle="{StaticResource CellEditing}" IsReadOnly="False" Width="*" Header="Value" 
CellEditingTemplateSelector="{StaticResource myCellEditingTemplateSelectorValue}" 
CellTemplateSelector="{StaticResource myCellTemplateSelectorValue}">
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

CellTemplateSelectors返回一个带有TextBlock的DataTemplate,用于Celltemplate resp.CellEditing的TextBox!

<DataTemplate x:Key="dGridStringValueTemplate">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Path=Value}"/>
</DataTemplate>

<DataTemplate x:Key="dGridStringValueTemplateEditing">
    <TextBox TextAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderThickness="1" Text="{Binding Path=Value, UpdateSourceTrigger=LostFocus}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

现在我想在DataGridCell获得焦点时自动聚焦TextBox.用户应该能够编辑TextBox内容而无需双击单元格.

我找到了这篇文章:

DataGrid提示与技巧:单击编辑 ,我可以获取当前DataGridCell,但是如何访问内容以使文本框成为编辑内容的焦点?

这是我的风格:

<Style x:Key="CellEditing" TargetType="{x:Type DataGridCell}">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="myDataGridMain_PreviewMouseLeftButtonDown"></EventSetter>
</Style>
Run Code Online (Sandbox Code Playgroud)

这是我的事件处理程序:

private void myDataGridMain_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;     // cell ist not null

    DataGridTemplateColumn col …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml datagrid

11
推荐指数
3
解决办法
2万
查看次数

绑定datagrid列宽

我有两个datagrids,每个都有一列.第一:

<DataGrid.Columns>
   <DataGridTextColumn x:Name="FilterTextCol01" 
                       IsReadOnly="False" 
                       Width="{Binding ElementName=TextCol01, Path=ActualWidth, Mode=TwoWay}" />
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)

第二:

<DataGridTextColumn CellStyle="{StaticResource DataGridColumnContentLeft}"
                    local:DataGridUtil.Name="TextCol01"
                    x:Name="TextCol01"
                    Header="TextCol01"
                    SortMemberPath="TextCol01"
                    Binding="{Binding TextCol01}" 
                    Width="Auto" 
                    IsReadOnly="True"/>
Run Code Online (Sandbox Code Playgroud)

第一列的宽度与第二列的宽度的绑定不起作用.如果我在代码中这样做:

FilterTextCol01.Width = TextCol01.ActualWidth;
Run Code Online (Sandbox Code Playgroud)

有用.谁能告诉我为什么第一种方法不起作用?

c# data-binding wpf xaml datagrid

10
推荐指数
1
解决办法
8853
查看次数

将列表绑定到DataGrid

我在WPF中将a绑定List到a时遇到问题DataGrid.让我解释一下我的尝试.

public struct SomeInfo
{
    public string Name;
    public string Description;
    public string ID;
}

List<SomeInfo> arrSomeInfo;
Run Code Online (Sandbox Code Playgroud)

arrSomeInfo包含结构的多个项目SomeInfo.

DataGrid看起来像:

<DataGrid Name="grdMailbag" AutoGenerateColumns="False" ItemsSource="{Binding}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="cID" Binding="{Binding ID}" Header="ID" />
        <DataGridTextColumn x:Name="cName" Binding="{Binding Name}" Header="Name" />
        <DataGridTextColumn x:Name="cDescription" Binding="{Binding Description}" Header="Description" />
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我试过以下没有成功:

this.grdMailbag.ItemsSource = arrSomeInfo; //Didn't worked
this.grdMailbag.DataContext= arrSomeInfo;  // Didn't worked
Run Code Online (Sandbox Code Playgroud)

发生的事情是它按行添加行,List arrSomeInfo但所有行都是空白的.

wpf binding datagrid

10
推荐指数
1
解决办法
2万
查看次数

具有绑定依赖属性的IValueConverter

我需要根据要绑定的对象中标识的单元系统确定运行时StringFormat的某些TextBlocks绑定.

我有一个具有依赖属性的转换器,我想绑定.Bound值用于确定转换过程.

public class UnitConverter : DependencyObject, IValueConverter
{
    public static readonly DependencyProperty IsMetricProperty =
        DependencyProperty.Register("IsMetric", typeof(bool), typeof(UnitConverter), new PropertyMetadata(true, ValueChanged));

    private static void ValueChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        ((UnitConverter)source).IsMetric = (bool)e.NewValue;
    }

    public bool IsMetric
    {
        get { return (bool)this.GetValue(IsMetricProperty); }
        set { this.SetValue(IsMetricProperty, value); }
    }

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (IsMetric)
            return string.Format("{0:0.0}", value);
        else
            return string.Format("{0:0.000}", value);
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf ivalueconverter

9
推荐指数
1
解决办法
5529
查看次数

在WPF中,如何从包含ListBox的DataTemplate内部数据绑定到Window DataContext?

我有一个WPF窗口,其视图模型设置为其DataContext,并且具有一个带有DataTemplate的ListBox,其ItemsSource绑定到视图模型,如下例所示:

查看型号:

using System.Collections.Generic;

namespace Example
{
    class Member
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Team
    {
        private List<Member> members = new List<Member>();

        public string TeamName { get; set; }
        public List<Member> Members { get { return members; } }
    }
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml:

<Window x:Class="Example.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:l="clr-namespace:Example" 
    Title="Example" Height="300" Width="300" Name="Main">

 <Window.DataContext>
  <l:Team TeamName="The best team">
   <l:Team.Members>
    <l:Member Name="John Doe" Age="23"/>
    <l:Member Name="Jane Smith" Age="20"/>
    <l:Member Name="Max Steel" …
Run Code Online (Sandbox Code Playgroud)

.net data-binding wpf datatemplate mvvm

8
推荐指数
2
解决办法
2万
查看次数

WPF DataGrid中的自定义CheckBox不会更新绑定

我有以下(简化)风格:

<Style x:Key="MyStyle" TargetType="{x:Type CheckBox}">  
    <Setter Property="Background" Value="Blue" />  
</Style>
Run Code Online (Sandbox Code Playgroud)

如果我在DataGridCheckBoxColumn中将它用作ElementStyle AND EditingElementStyle:

<DataGridCheckBoxColumn Binding="{Binding IsEnabled}"  
                        ElementStyle="{StaticResource MyStyle}"  
                        EditingElementStyle="{StaticResource MyStyle}" />
Run Code Online (Sandbox Code Playgroud)

然后,IsEnabled当我选中/取消选中行的复选框时,我的绑定不会切换.如果我删除ElementStyle,EditingElementStyle或两者,那么绑定更新没有问题.为什么是这样?!

此外,我尝试使用以下代码解决此问题:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsEnabled}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在.

c# wpf binding datagrid

8
推荐指数
2
解决办法
7272
查看次数