相关疑难解决方法(0)

绑定datagrid列可见性MVVM

.Net 3.5

我知道列不继承datacontext并通过阅读其他帖子我认为这将工作:

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self},
                     Path=(FrameworkElement.DataContext).IsColumnNameVisible,
                     Converter={StaticResource boolToVisConverter}}"
Run Code Online (Sandbox Code Playgroud)

但是当然它没有..输出窗口没有抱怨,似乎我找到的资源但是viewmodel属性是更新的调用.

这是整个DG:

<tk:DataGrid                                        
            VirtualizingStackPanel.IsVirtualizing="False"                                        
            Grid.Column="0"
            AlternationCount="2"
            AreRowDetailsFrozen="True"
            AutoGenerateColumns="False"
            Background="Transparent"
            BorderThickness="0"
            CanUserAddRows="False"
            CanUserReorderColumns="True"
            CanUserResizeRows="False"
            GridLinesVisibility="None"
            ItemsSource="{Binding Employees}"
            SelectionMode="Single"
            ColumnHeaderStyle="{StaticResource columnHeaderStyle}"
            RowHeaderStyle="{StaticResource rowHeaderStyle}"
            CellStyle="{StaticResource cellStyle}"
            RowStyle="{StaticResource rowStyle}" 
            ContextMenu="{StaticResource columnHeaderContextMenu}">
    <tk:DataGrid.Resources>
        <ContextMenu x:Key="columnHeaderContextMenu" ItemsSource="{Binding ColumnHeaderContextMenuItems}" />
        <Style TargetType="{x:Type ScrollBar}">
            <Setter Property="Background" Value="Transparent"/>
        </Style>                                    
        <Style TargetType="{x:Type tk:DataGridColumnHeader}">
            <Setter Property="Background" Value="Transparent"/>
        </Style>
    </tk:DataGrid.Resources>
    <tk:DataGrid.Triggers>
        <EventTrigger RoutedEvent="tk:DataGridRow.MouseDoubleClick">
            <EventTrigger.Actions>
                <BeginStoryboard Storyboard="{StaticResource showDetailGrid}"/>
            </EventTrigger.Actions>
        </EventTrigger>
    </tk:DataGrid.Triggers>
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn IsReadOnly="True" Header="test" Binding="{Binding Name, Mode=OneWay}" Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml wpftoolkit .net-3.5

49
推荐指数
1
解决办法
3万
查看次数

如何使用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万
查看次数

DataGridTextColumn可见性绑定

我正在尝试将列可见性绑定到另一个元素的可见性,如下所示:

<Window x:Class="WpfApplication1.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="BooleanToVisibilityConverter" />
</Window.Resources>
<StackPanel>
    <CheckBox x:Name="chkColumnVisible" Content="Show column" />
    <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column1" Visibility="{Binding ElementName=chkColumnVisible, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

但我在VS输出中得到这个错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsChecked; DataItem=null; target element is 'DataGridTextColumn' (HashCode=48860040); target property is 'Visibility' (type 'Visibility')
Run Code Online (Sandbox Code Playgroud)

是否有纯XAML方法来实现这一目标?

c# wpf xaml wpfdatagrid

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

如何将命令绑定到MenuItem(WPF)?

这是我在View.xaml.cs中的代码:

private RelayCommand _closeCommand;
public ICommand CloseCommand
{
    get
    {
        if (_closeCommand == null)
        {
            _closeCommand = new RelayCommand(param => this.OnClose());
        }
        return _closeCommand;
    }
}

public void OnClose()
{
    Close();
}
Run Code Online (Sandbox Code Playgroud)

以下是我的View.xaml中的一些代码:

<Window.ContextMenu>
    <ContextMenu>
        <MenuItem Name="menuItem_Close" Header="Close" Command="{Binding CloseCommand}" />
    </ContextMenu> 
</Window.ContextMenu>
Run Code Online (Sandbox Code Playgroud)

当我运行程序并选择关闭菜单项时,没有任何反应.CloseCommand代码甚至没有被执行.

data-binding wpf command menuitem relaycommand

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

绑定到当前ItemsSource上下文之外的DataContext

DataSet有义务Window.DataContext; 我还有一个DataGrid:

<DataGrid ItemsSource={Binding Tables[Items]}>
    <DataGrid.Columns>
        <DataGridTextBoxColumn Header={Binding Path=DataContext.Tables[Names]/Test, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} />
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

基本上,我正在尝试将该列的Header绑定到DataTable"Names",列"Test",第一行.

但是,我无法做到对.请注意,我可以在DataGrid外部绑定它.Grid的ItemsSource更改了数据上下文,我不知道如何在外部引用原始DataContext.

似乎绑定成功了; 但问题是Window.DataContext中Tables [Names]的当前项(第一行)丢失了.

如果我使DataSet静态并通过{x:Static local:dataset}访问它,那么事情就可以了.但我不能使用静态数据集,因为会有多个实例(多用户).

有谁能指出我正确的方向?

data-binding wpf datagrid relativesource itemssource

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

如何在DataGrid列标题上设置DataContext

在我的Silverlight 3用户控件中,我显示了一个基本的DataGrid控件.我需要以编程方式生成列,如下所示:

Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
col.HeaderStyle = headerStyle;
dataGrid.Columns.Add(col);
Run Code Online (Sandbox Code Playgroud)

样式定义如下:

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" 
       TargetType="prim:DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Loaded="StackPanel_Loaded">
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Data}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

我想将标题的数据上下文设置为"标题"对象(具有"名称"和"数据"属性,这些属性在DataTemplate中引用).不幸的是,我无法在其他地方使用StackPanel_Loaded事件,因为当用户启动列拖放操作时也会调用事件处理程序.

设置DataGrid列标题的DataContext的正确方法是什么?

silverlight datagrid columnheader

7
推荐指数
2
解决办法
8772
查看次数

ItemsControl与WrapPanel一起作为ItemsPanel - 组合一个"静态"子项和ItemsSource

使用带有WrapPanel设置为ItemsPanel的ItemsControl,我试图实现此图像中说明的内容: 使用WrapPanel作为ItemsPanel的ItemsControl

XAML看起来像这样(修改后使其更简单):

<ItemsControl ItemsSource="{Binding Animals}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border Margin="5">
                <Image Source="{Binding ImageUrl}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

底层的ViewModel如下所示:

public class Zoo
{
    public ObservableCollection<Animal> Animals { get; set; } = new ObservableCollection<Animal>(); 

    public ICommand AddAnimal() => new DelegateCommand(() => Animals.Add(new Animal()));
}

public class Animal
{
    public string ImageUrl { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ItemsControl的DataContext设置为Zoo的一个实例,并填充4个Animals.

问题: 如何添加一个看起来像其他元素的"静态"子元素,是WrapPanel的子元素,并与其他子元素包装?具体来说,我希望最后一个元素是一个添加按钮(上图中显示的绿色加号),它绑定到Zoo的AddAnimal Command属性.

要求:

  • add-button-element必须与WrapPanel的其他子项一起包装.
  • add-button-element必须始终是最后一个(或第一个)元素,如果Zoo中没有Animals,也应该是可见的.
  • 将一个虚拟Animal添加到Animals集合中然后使用样式来修改最后一个子节点不是一个选项.底层模型在应用程序中使用了很多地方,因此在动物集合中放置一个虚拟动物太过于愚蠢.

我考虑过:

  • 使用将Animals-collection复制到新集合的转换器,将一个虚拟Animal添加到副本,然后将其返回到ItemsControl的ItemsSource绑定.然后我可以将最后一个元素设置为添加按钮.但是,这不是一个选项,因为一些拖放逻辑需要能够通过ItemsControl的ItemsSource属性处理原始的ObservableCollection.
  • 对WrapPanel进行子类化并将add-button-element添加为子元素而不修改ItemsSource属性似乎是最佳选择(如果可能),但我无法弄清楚如何做到这一点.

附加信息:我使用:WPF,PRISM,C#6.0,.NET 4.0 Client Profile和MVVM模式.

有关这个问题的任何想法?

解: …

c# wpf xaml

6
推荐指数
1
解决办法
1006
查看次数

绑定到datacontext parent-WPF的属性

我有一个DataGrid:

 <DataGrid x:Name="DG" ItemsSource="{Binding}" AutoGenerateColumns="False">
     <DataGrid.Columns>
          <DataGridTextColumn Header="?" Binding="{Binding l}">
          </DataGridTextColumn>
     </DataGrid.Columns>
  </DataGrid>
Run Code Online (Sandbox Code Playgroud)

在DataGrid的DataContext中有一个类X的集合:

public ObservableCollection<xxx> col{ get; set; }// = DataContext of DG

    private string lName;

    public string LName
    {
        get { return lName; }
        set
        {
            lName= value;
            NotifyPropertyChanged("LName");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我希望lName将是DataGrid中特定列的标题

我这样试试:

 <DataGridTextColumn  Binding="{Binding l}">//l=prop of xxx class that contains the collection
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding DataContext.LName,
                       RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

那没起效

怎么办呢?

wpf binding datagrid

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

从DataGridColumn中绑定到DataContext属性

财产Foo在我的DataContext

ViewModel {
    Visibility Foo;
}
Run Code Online (Sandbox Code Playgroud)


但我无法弄清楚如何进入Foo内部Column.在这种情况下,我认为它可能正在寻找Foo任何绑定到的对象DataGrid ItemsSource

<DataGrid Visibility="{Binding Foo}">                      // works
    <DataGrid.Columns>
        <DataGridTextColumn Visibility="{Binding Foo}" />   // fails
Run Code Online (Sandbox Code Playgroud)


我试过了

Binding="{Binding DataContext.Foo}"
Run Code Online (Sandbox Code Playgroud)

还有很多带RelativeSource标签的东西.


另外,有没有办法查看和选择要从GUI绑定的属性?

编辑:事实证明,列本身不是FrameworkElements,因此无法找到DataGrid祖先.但是,您可以在下面的答案中使用该技术将Column的CellTemplate的属性绑定到DataContext.

.net wpf datacontext xaml binding

4
推荐指数
1
解决办法
3928
查看次数

在WPF中绑定DataGridTextColumn可见性属性

我有一个ItemsSource绑定到a 的数据网格CollectionViewSource.
在每列中,我指定Path绑定的属性以获取要显示的特定信息.

如果用户想要更多信息,我想要做的是用一个复选框切换一些列.为此,我需要将visibility属性绑定到复选框的值(使用转换器),但我非常确定列的数据上下文是否干扰绑定.

<DataGrid ItemsSource="{Binding Source={StaticResource cvs}}" ....>
    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"
            Visibility="{Binding IsChecked,
                                 ElementName=IncludeFullHist, 
                                 Converter={StaticResource boolItemsConverter}}"/>   
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我也需要我的viewmodel中的复选框,所以我将其IsChecked属性绑定到我的ViewModel上的属性

<CheckBox x:Name="IncludeFullHist"  IsChecked="{Binding Path=ManagerFullHist }" />
Run Code Online (Sandbox Code Playgroud)

对于我页面中的其他元素,我已经能够使用以下两种方法中的任何一种来连接可见性绑定,但是当我将它们复制到datagrid时似乎都不起作用:

<TextBlock DockPanel.Dock="Left" Text=" Visible 2 " 
    Visibility="{Binding Path=DataContext.ManagerFullHist,
                         RelativeSource={RelativeSource FindAncestor,
                         AncestorType={x:Type UserControl}},
                         Converter={StaticResource boolItemsConverter}}"/>
<TextBlock DockPanel.Dock="Left" Text=" Visible 3 " 
    Visibility="{Binding Path=ManagerFullHist, 
                         Source={StaticResource mainWinResource},
                         Converter={StaticResource boolItemsConverter}}"/>
Run Code Online (Sandbox Code Playgroud)

关于我可以在datagrid中解决这个问题的方法的任何建议?
如果我省略了任何可能有用的代码,请告诉我.

data-binding wpf xaml bindingsource itemssource

3
推荐指数
1
解决办法
4628
查看次数

如何从 ResourceDictionary 引用 BindingProxy 实例

任何 wpf 程序员迟早都会开始使用BindingProxy

我试图通过将一些资源移动到单独的资源字典中来拆分 xaml。我的问题是资源包含对BindingProxy.

我该如何处理这种情况?

举个例子,假设有一个资源在BindingProxy某处使用

<Window.Resources>
    <local:BindingProxy x:Key="proxy" />
    <ControlTemplate x:Key="test">
        <TextBlock Text="{Binding DataContext.Test, Source={StaticResource proxy}}" />
    </ControlTemplate>
</Window.Resources>
<Control Template="{StaticResource test}" />
Run Code Online (Sandbox Code Playgroud)

和后面的代码

public partial class MainWindow : Window
{
    public string Test { get; set; } = "Test 123";

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }
}
Run Code Online (Sandbox Code Playgroud)

它可能不是最好的例子,使用BindingProxy并不合理,但它很好地达到了演示目的。在运行时窗口中将"Test 123"显示文本。


现在让我们尝试将资源移动到资源字典中Dictionary1.xaml

<ResourceDictionary ... >
    <ControlTemplate x:Key="test">
        <TextBlock Text="{Binding Test, Source={StaticResource proxy}}"  /> <!-- error here …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf

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

从 Avalonia 中的 ItemsControl 按钮绑定到 MainViewModel 命令

我正在尝试从 Avalonia 中的 ItemsControl 按钮创建 ReactiveUI MVVM 绑定,在 WPF 中,这将通过 Freezable BindingProxy 完成。不过,Freezable 似乎在 Avalonia 中不可用。应该如何创建这样的绑定?

            <ItemsControl Items="{Binding MyQueue}">
              <ItemsControl.ItemTemplate>
                <DataTemplate>
                  <Button Content="My Button"
                          HorizontalAlignment="Center" VerticalAlignment="Center"
                          CommandParameter="{Binding}"
                          Command="{Binding MySpecialCmd}"/>
                </DataTemplate>
              </ItemsControl.ItemTemplate>
            </ItemsControl>
Run Code Online (Sandbox Code Playgroud)

参考文献:
/sf/ask/1545161831/\ https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-数据上下文未继承时的数据/

c# mvvm reactiveui avaloniaui

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