Gyp*_*psy 14 data-binding wpf binding wpfdatagrid
我需要将Visibility
a DataGridTemplateColumn
的一个属性绑定到一个外面的属性DataGrid.ItemsSource
,因为我需要将所有行中的这个列绑定到其中的一个属性ViewModel
,但据我所知你只是可以将它绑定到内部的某个属性,ItemsSource
或者你应该使用ElementStyle
,EditingElementStyle
我已经尝试过这段代码:
<DataGridTemplateColumn Header="post"
Visibility="{Binding DataContext.ProjectPostVisibility
, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
Run Code Online (Sandbox Code Playgroud)
我确定我的绑定是正确的,因为当我绑定DataGridCell.Visibility
下面的代码时它工作正常:
<DataGridTemplateColumn Header="post">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Visibility" Value="{Binding DataContext.ProjectPostVisibility,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
</Style>
</DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn >
Run Code Online (Sandbox Code Playgroud)
正如其他答案中提到的,该列不是视觉/逻辑树的一部分,并且不会继承FrameworkElement
它没有的含义DataContext
。这就是你的绑定不起作用的原因。
但是,您可以FrameworkElement
在您要查找的级别添加一个虚拟(折叠) DataContext
(因此以您的示例为例,它位于 DataGrid 的级别),折叠它并将其用作绑定的源x:Reference
标记扩展。
这是一个例子:
<FrameworkElement x:Name="Proxy" Visibility="Collapsed"/>
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn Header="post"
Visibility="{Binding DataContext.ProjectPostVisibility, Source={x:Reference Name=Proxy}}"/>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
在 DataGridTemplateColumn.CellStyle 中添加此设置器并完成:
<Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
Run Code Online (Sandbox Code Playgroud)
如果您需要更多帮助,请查看下面我的示例。我希望“删除”按钮在项目级别不可见。首先,您必须确保视图模型中有 isVisible 属性:
private System.Windows.Visibility _isVisible;
public System.Windows.Visibility isVisible
{
get { return _isVisible; }
set
{
if (_isVisible != value)
{
_isVisible = value;
OnPropertyChanged("isVisible");
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
if (isProj == false)
this.model.isVisible = Visibility.Visible;
else
this.model.isVisible = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)
XAML:
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate >
<DataTemplate >
<Button x:Name="btnRemove" Content="X">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="FontWeight" Value="ExtraBold" />
<Setter Property="FontSize" Value="50" />
</Style>
</Button.Style>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="Red"/>
<Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
</Style>
</DataGridTemplateColumn.CellStyle>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12947 次 |
最近记录: |