.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) 使用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) 我正在尝试将列可见性绑定到另一个元素的可见性,如下所示:
<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方法来实现这一目标?
这是我在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代码甚至没有被执行.
我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}访问它,那么事情就可以了.但我不能使用静态数据集,因为会有多个实例(多用户).
有谁能指出我正确的方向?
在我的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的正确方法是什么?
使用带有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属性.
要求:
我考虑过:
附加信息:我使用:WPF,PRISM,C#6.0,.NET 4.0 Client Profile和MVVM模式.
有关这个问题的任何想法?
解: …
我有一个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)
那没起效
怎么办呢?
财产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.
我有一个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中解决这个问题的方法的任何建议?
如果我省略了任何可能有用的代码,请告诉我.
任何 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) 我正在尝试从 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-数据上下文未继承时的数据/
wpf ×10
c# ×6
xaml ×6
data-binding ×4
datagrid ×4
binding ×2
itemssource ×2
mvvm ×2
.net ×1
.net-3.5 ×1
avaloniaui ×1
columnheader ×1
command ×1
datacontext ×1
menuitem ×1
reactiveui ×1
relaycommand ×1
silverlight ×1
wpfdatagrid ×1
wpftoolkit ×1