Caliburn Micro: ElementName для ComboBox в DataGrid не работает
Моя проблема заключается в том, что ItemsSource ComboBox в DataGrid не является обязательным. Мой UserControl:
<UserControl x:Class="MyClass"
x:Name="Root"
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"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
mc:Ignorable="d"
d:DesignHeight="360" d:DesignWidth="757">
Сетка данных:
<DataGrid x:Name="Article"
AutoGenerateColumns="False"
SelectionUnit="FullRow"
SelectionMode="Single"
CanUserAddRows="False"
CanUserDeleteRows="True"
Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4"
Margin="5">
<DataGrid.Columns>
<DataGridTemplateColumn Width="*"
Header="Article">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding FilteredArticle, ElementName=Root}" IsEditable="True"
cal:Message.Attach="[Event KeyUp] = [Action FindArticlel($source)]" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Если я не говорю ElementName=Root, он пытается связать FilteredArticle в классе Article. Если я говорю ElementName=Root, он говорит следующее во время выполнения:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=Root'. BindingExpression:Path=FilteredArticle; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')
FilteredArticle является BindableCollection в моей ViewModel. Все остальные привязки работают. Что здесь не так? Использование последней стабильной версии Caliburn.Micro.
1 ответ
Привязка к виду через ElementName
обычно плохая практика. Главным образом потому, что кто-то, кто создает экземпляр представления, может дать ему другое x:Name
и это сломает вашу внутреннюю привязку.
Плюс FilteredArticle
Свойство - это не свойство представления, а модель представления, которая является контекстом данных для представления.
Используйте относительный источник для привязки в этих сценариях
ItemsSource="{Binding DataContext.FilteredArticle,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}}"
Вы можете использовать более конкретную запись (хотя в 99% случаев это не обязательно)
ItemsSource="{Binding DataContext.FilteredArticle,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type local:MyClass}}}"
куда local
это xmlns
для пространства имен MyClass