我得到了像这样的xaml代码:
<UserControl x:Class="WindowsFormsApplication4.gg"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
xmlns:local="clr-namespace:WindowsFormsApplication4"
x:Name="myUserControl"
d:DesignHeight="300" d:DesignWidth="300">
<StackPanel>
<TextBox Text="{Binding ElementName=myUserControl, Path=DataContext.IsActive}"></TextBox>
<Grid>
<DataGrid x:Name="dataGrid1" AutoGenerateColumns="false" ItemsSource="{Binding MyClass}" CanUserAddRows="False" Margin="0,0,0,-119">
<DataGrid.Columns>
<!-- Caption -->
<DataGridTemplateColumn Header="X">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Text="{Binding Path=stringPro}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Caption -->
<DataGridTemplateColumn Header="Y">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Text="{Binding ElementName=myUserControl, Path=DataContext.IsActive}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</StackPanel>
</UserControl>
Code Behind仅设置数据上下文:
this.DataContext = new SomeViewModel();
SomeClass.cs:
namespace WindowsFormsApplication4
{
public class SomeClass
{
public SomeClass()
{
this.MyProperty = 2;
this.stringPro = "abcsdfg";
}
public int MyProperty { get; set; }
public string stringPro { get; set; }
}
}
SomeViewModel.cs:
namespace WindowsFormsApplication4
{
using System.Collections.Generic;
public class SomeViewModel
{
public SomeViewModel()
{
this.IsActive = false;
this.MyClass = new List<SomeClass>();
this.MyClass.Add(new SomeClass());
this.MyClass.Add(new SomeClass());
}
public bool IsActive { get; set; }
public List<SomeClass> MyClass { get; set; }
}
}
我尝试使用ElementName
在** DataGrid
**之外工作但不在
Text="{Binding ElementName=myUserControl, Path=DataContext.IsActive}"
答案 0 :(得分:3)
您可以使用RelativeSource
执行此操作<TextBox VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.IsActive}"/>
经过测试的例子:
<DataGrid x:Name="dataGrid1" AutoGenerateColumns="false" ItemsSource="{Binding MyClass}" CanUserAddRows="False" Margin="0,0,0,-119">
<DataGrid.Columns>
<!-- Caption -->
<DataGridTemplateColumn Header="X">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Text="{Binding Path=stringPro}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Caption -->
<DataGridTemplateColumn Header="Y">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.IsActive}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<CheckBox IsChecked="{Binding IsActive}"/>
更改了Ctor中的IsActive
值
public class SomeViewModel
{
public SomeViewModel()
{
this.IsActive = false;
this.MyClass = new List<SomeClass>();
this.MyClass.Add(new SomeClass());
this.MyClass.Add(new SomeClass());
// Test it
IsActive = true;
}
public bool IsActive { get; set; }
public List<SomeClass> MyClass { get; set; }
}