Проблема связывания в C # wpf - PullRequest
1 голос
/ 08 июня 2010

У меня проблема с привязкой в ​​wpf. У меня есть текстовое поле, в котором я могу сделать некоторый ввод, затем я пытаюсь связать ввод текста с пользовательским контролем пользователя. Эта работа для пользовательского контроля в RowDetailsTemplate, но не в CellTemplate. Для каждого объекта в CellTemplate я получаю эту ошибку:

System.Windows.Data Ошибка: 4: не удается найти источник для привязки со ссылкой «ElementName = ScaleTextBox». BindingExpression: Path = Text; DataItem = NULL; целевым элементом является 'Chart' (Name = ''); Свойство target - MaxValue (тип Int32)

Мой код выглядит так:

XAML
<ToolBarTray ToolBarTray.IsLocked="True"  DockPanel.Dock="Top" Height="25">
    <ToolBar Name="ButtonBar" >
        <TextBox Height="23" Name="ScaleTextBox" Width="120" Text="400"/>
    </ToolBar>
</ToolBarTray>
<DataGrid ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" IsReadOnly="True" RowHeight="25" RowDetailsVisibilityMode="VisibleWhenSelected">
       <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" >
                <my:UserControl ItemsSource="{Binding Path=Samples}" MaxValue="{Binding ElementName=ScaleTextBox, Path=Text}"/>-->
            </StackPanel>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    <DataGrid.Columns>
        <DataGridTemplateColumn MinWidth="150" Header="Chart" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <my:UserControl ItemsSource="{Binding Path=Samples}" MaxValue="{Binding ElementName=ScaleTextBox, Path=Text}"/><!-- this is the problem -->
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

    </DataGrid.Columns>

</DataGrid>

C#
public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register("MaxValue", typeof(int), typeof(Chart), new FrameworkPropertyMetadata(MaxValuePropertyChanged));
private static void MaxValuePropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    Console.WriteLine(e.NewValue);
}

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 08 июня 2010

С по этой ссылке

Коллекция Columns - это просто свойство в Datagrid; эта коллекция не находится в логическом (или визуальном) дереве, поэтому DataContext не наследуется, что приводит к тому, что не с чем связываться.

Следовательно, это работает для вашего RowDetailsTemplate, а не для ваших столбцов, я думаю.

0 голосов
/ 29 июня 2010

Хорошо, я решил это с помощью ElementSpy, чтобы посмотреть, как работает elementSpy, здесь: http://joshsmithonwpf.wordpress.com/2008/07/22/enable-elementname-bindings-with-elementspy/

и xaml:

<my:UserControl  local:ElementSpy.NameScopeSource="{StaticResource ElementSpy}" ItemsSource="{Binding Path=Samples}" MaxValue="{Binding ElementName=ScaleTextBox, Path=Text}" />
0 голосов
/ 08 июня 2010

Вы можете попробовать это:

<DataTemplate>
   <my:UserControl 
     ItemsSource="{Binding Path=Samples}" 
     MaxValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:YourControlClassName}}, ElementName=ScaleTextBox, Path=Text}"/>
</DataTemplate> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...