Patrick Skelton Ответов: 1

Как привязать свойство столбца datagrid isreadonly к другому свойству связанного элемента


Это, вероятно, легче показать в коде, чем спросить по-английски.

У меня есть список в моем представлении-модель, что-то вроде этого:

public class CostItems
{
	public string Name { get; set; } "";
	
	public double UnitCost { get; set; } = 0.0;
	
	public bool UnitCostFixed { get; set; } = false;
}


public List<CostItem> CostItems = new List<CostItem>();


И мой XAML для отображения этого выглядит примерно так:

<DataGrid Grid.Row="1" Grid.Column="0" ItemsSource="{Binding CostItems}"
	AutoGenerateColumns="False"
	HeadersVisibility="Column"
	SelectionUnit="Cell" SelectionMode="Single">
	<DataGrid.Columns>
		<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
		<DataGridTextColumn Header="Unit Cost">
			<DataGridTextColumn.Binding>
				<Binding Path="UnitCost" UpdateSourceTrigger="LostFocus">
					<Binding.ValidationRules>
						<u:CurrencyNonNegativeValidator/>
					</Binding.ValidationRules>
					<Binding.Converter>
						<u:CurrencyConverter/>
					</Binding.Converter>
				</Binding>
			</DataGridTextColumn.Binding>
		</DataGridTextColumn>
	</DataGrid.Columns>
</DataGrid>


То, что я хочу сделать, - это связать IsReadOnly собственность компании DataGridTextColumn это показывает, что UnitCost к UnitCostFixed свойство одного и того же элемента в списке.

Я предполагаю, что мне нужна какая-то форма привязки RelativeSource, но не могу ее решить.

Как мне это сделать?

Что я уже пробовал:

Я пробовал смотреть на визуальное дерево, но оно, кажется, не показывает достаточно деталей (то есть оно останавливается на DataGrid.

Я также попытался увеличить отладочную информацию, поступающую из механизма привязки, установив :
diag:PresentationTraceSources.TraceLevel="High"
но, похоже, я не получаю многого из того, что мне помогает.

Gerry Schmitz

Это не логично: вы хотите привязать свойство столбца к значению в "строке" (т. е. элементу). Это относится и к "клетке".

Patrick Skelton

Спасибо за ответ. Вы, конечно, правы. Вскоре после публикации я понял, что то, что я пытался сделать, просто не имело смысла. Я воздерживался от ответа, пока не получил что-то, что работает, и теперь я опубликовал это.

1 Ответов

Рейтинг:
0

Patrick Skelton

Это, кажется, делает трюк. Что я делаю, так это использую столбец шаблона вместо обычного текстового столбца. Теперь я могу поменять местами шаблоны для каждой отдельной ячейки на основе свойств, к которым привязана эта строка в сетке. Поэтому у меня тогда просто есть одна редактируемая версия шаблона и одна, которая доступна только для чтения.

<DataGrid ItemsSource="{Binding CostItems}"
	HeadersVisibility="Column"
	SelectionUnit="Cell"
	SelectionMode="Single">

	<DataGrid.Resources>
		<DataTemplate x:Key="UnitCostAllowModifyTemplate">
			<TextBox IsReadOnly="False" IsTabStop="True">
				<Binding Path="UnitCost" UpdateSourceTrigger="LostFocus"/>
			</TextBox>
		</DataTemplate>
		<DataTemplate x:Key="UnitCostBlockModifyTemplate">
			<TextBox IsReadOnly="True" IsTabStop="False">
				<Binding Path="UnitCost"/>
			</TextBox>
		</DataTemplate>
	</DataGrid.Resources>

	<DataGrid.Columns>
		<DataGridTextColumn Header="Name" Binding={Binding Name}"/>
		<DataGridTemplateColumn Header="Unit Cost">
			<DataGridTemplateColumn.CellTemplate>
				<DataTemplate>
					<ContentControl Content="{Binding .}">
						<ContentControl.Style>
							<Style TargetType="{x:Type ContentControl}">
								<Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
								<Setter Property="ContentTemplate" Value="{StaticResource UnitCostAllowModifyTemplate}" />
								<Style.Triggers>
									<DataTrigger Binding="{Binding UnitCostFixed}" Value="False">
										<Setter Property="ContentTemplate" Value="{StaticResource UnitCostBlockModifyTemplate}" />
									</DataTrigger>
								</Style.Triggers>
							</Style>
						</ContentControl.Style>
					</ContentControl>
				</DataTemplate>
			</DataGridTemplateColumn.CellTemplate>
		</DataGridTemplateColumn>
	</DataGrid.Columns>
</DataGrid>


Полезный Совет Я нашел в интернете, чтобы использовать фиктивный конвертер на любой привязке, которую вы не можете отладить. Затем вы можете взломать отладчик и посмотреть, какой именно объект получает привязка.