I’m banging my head on my desk with this binding error.. I have checked several of the postings for the BindingExpression
path error and cannot see anything that works with my situation.
Anyway, I have a custom control called IncrementingTextBox
. I am trying to disable it whenever the user ‘checks’ the CheckBox
above it.
I have a binding on the CheckBox
IsChecked
property that is working fine and is firing when it is supposed to. It is correctly setting the UseSensorLength
property on the ConfigurationModel.
However, the binding on the IncrementingTextBox
IsEnabled
property is causing a BindingExpression
path error and so doesn’t update at all.
As a test, I tried in the code behind to enable and disable the control and it works just fine, but I can’t seem to get the Binding to work on it.
Here is a snippet from my xaml:
...
DataContext="{Binding RelativeSource={RelativeSource Self}}"
...
...
<CheckBox Content="Use Sensor Length" Margin="30,6,0,0"
IsChecked="{Binding ConfigurationModel.UseSensorLength, Mode=TwoWay}"/>
<local:IncrementingTextBox x:Name="video_length_textbox" Margin="0,0,0,5"
IsTextEnabled="False"
IsEnabled="{Binding ConfigurationModel.DontUseSensorLength}"
ValueChanged="VideoEventValueChanged"/>
And Here is a snippet from my ConfigurationModel:
public bool DontUseSensorLength
{
get { return !UseSensorLength; }
}
public bool UseSensorLength
{
get { return _useSensorLength; }
set
{
_useSensorLength = value;
OnPropertyChanged("UseSensorLength");
OnPropertyChanged("DontUseSensorLength");
}
}
Here is the error message I am getting in my output window when running the app:
System.Windows.Data Error: 40 : BindingExpression path error:
‘ConfigurationModel’ property not found on ‘object’
»IncrementingTextBox’ (Name=’video_length_textbox’)’.
BindingExpression:Path=ConfigurationModel.DontUseSensorLength;
DataItem=’IncrementingTextBox’ (Name=’video_length_textbox’); target
element is ‘IncrementingTextBox’ (Name=’video_length_textbox’); target
property is ‘IsEnabled’ (type ‘Boolean’)
Remember, the ‘UseSensorLength’ property binding is working fine, but the ‘DontUseSensorLength’ binding is causing the above ‘BindingExpression path error’.
Greetings;
I’m having difficulty using WPF’s support for Data Binding a generic List<> instance to a Read-Only DataGrid inside a Window. To setup the Data Binding, I have the following in place in the code:
1.) I set the Window’s DataContext to a reference type of FormattedStackTrace exposed as a public property named StackTrace. The DataContext is set in the Window’s class constructor in C# as follows:
public CallStackDialog(Window owner, FormattedStackTrace stackTrace) { InitializeComponent(); this.Owner = owner; StackTrace = stackTrace; DataContext = StackTrace; return; }
The instance of StackTrace is non-null, and I can access and view all of its property members through the StackTrace property as expected. Likewise, the Window’s DataContext is a non-null value.
2.) The StackTrace property is implemented in the same window class as follows:
private FormattedStackTrace formattedStackTrace; public FormattedStackTrace StackTrace { get { return formattedStackTrace; } set { formattedStackTrace = value; NotifyPropertyChanged("StackTrace"); } }
3.) The FormattedStackTrace class contains an instance of List<OrderedCall> as an auto property named OrderedStackTrace. I am trying to bind this collection as the ItemsSource for the DataGrid in the window. The relative members of the FormattedStackTrace,
which is the backing reference type for the Window’s DataContext, is as follows:
public class FormattedStackTrace { #region FormattedStackTrace Class Data Members & Auto-Properties private StackFrame[] sourceStackFrame; public MethodBase CallingMethod { get; private set; } public List<OrderedCall> OrderedStackTrace { get; private set; } #endregion }
OrderedStackTrace is a List<OrderedCall>, where each List member is an instance of the following structure:
public struct OrderedCall { public int Call; public string Method; };
At the point where the DataContext is set inside the parent Window’s class constructor, the OrderedStackTrace property is correct, in that it contains the expected number of OrderedCall instance values, and they can be viewed without issue inside any of the
Debugging tabs inside Visual Studio 2010, or inside the IDE’s Immediate Window:
? StackTrace.OrderedStackTrace == null
false
? StackTrace.OrderedStackTrace.Count
40
? StackTrace.OrderedStackTrace[39]
{WPFEventHandling.OrderedCall}
Call: 40
Method: «WPFEventHandling.MainWindow.OnMousePointerEnteredButton(Object sender, MouseEventArgs e)»
4.) The DataGrid inside the Window I’m trying to bind to, StackTraceDataGrid, which is read only, is implemented in XAML as follows:
<DataGrid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Name="StackTraceDataGrid" IsReadOnly="True" AutoGenerateColumns="False" Margin="10" ItemsSource="StackTrace.OrderedStackTrace"> <DataGrid.Columns> <DataGridTextColumn Header="Offest" Binding="{Binding Call}" Width="60"> </DataGridTextColumn> <DataGridTextColumn Header="Method" Binding="{Binding Method}" Width="*"> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
When I build the solution containing this Window and the child StackTraceDataGrid control, there are no errors nor compiler warnings. When I bring up the parent window that contains StakTraceDataGrid, the DataGrid and the two Text Columns, Offset and
Method, are rendered and formatted as expected, but each row in the DataGrid is empty. When the Window is brought up, the following set of runtime messages appear for each pair of OrderedCall member values in each column for each row:
System.Windows.Data Error: 40 : BindingExpression path error: ‘Call’ property not found on ‘object’ »Char’ (HashCode=7471218)’. BindingExpression:Path=Call; DataItem=’Char’ (HashCode=7471218); target element is ‘TextBlock’ (Name=»); target property is ‘Text’
(type ‘String’)
System.Windows.Data Error: 40 : BindingExpression path error: ‘Method’ property not found on ‘object’ »Char’ (HashCode=7471218)’. BindingExpression:Path=Method; DataItem=’Char’ (HashCode=7471218); target element is ‘TextBlock’ (Name=»); target property is
‘Text’ (type ‘String’)
As far as I can tell, I think that my problem may lie in how I’ve defined the ItemsSource property for the DataGrid, and the Binding Path for each column for each instance of OrderedCall as I would like to have displayed in each row of the Grid.
I would really appreciate any corrections on how to resolve the BindingExpression path errors I’m seeing at runtime, as well as any background informatio on what each DataGrid Column is expecting for a Binding Path for each item in each row of the DataGrid.
Thank you in advance for your time and help, and I look forward to hearing from you soon.
Igorian 1 / 1 / 0 Регистрация: 22.11.2013 Сообщений: 19 |
||||||||||||||||||||||||
1 |
||||||||||||||||||||||||
03.11.2015, 12:21. Показов 7783. Ответов 8 Метки wpf (Все метки)
Здравствуйте, у меня есть Главное окно, есть 2 контрола. В 1-ом контроле у меня listBox, во втором label, соединяю я их в MainWindow. Так вот, мне нужно, чтобы в главном окне я нажимал на listBox и у меня имя, выбранное в ListBox-е отображалось в Label. Список выводит, но при нажатии ничего не происходит, а пишется ошибка Кто-нибудь помогите, плз! 1.Главное окно —
xaml к MainWindow
,
,
,
,
0 |
amarf Жуткая тВарЬ 391 / 326 / 135 Регистрация: 06.02.2015 Сообщений: 962 Записей в блоге: 1 |
||||
03.11.2015, 14:19 |
2 |
|||
1 |
1 / 1 / 0 Регистрация: 22.11.2013 Сообщений: 19 |
|
03.11.2015, 23:09 [ТС] |
3 |
Неа, не помогает, теперь вылетает ошибка -> System.Windows.Data Error: 40 : BindingExpression path error: ‘name’ property not found on ‘object’ »MainWindow’ (Name=»)’. BindingExpression:Path=name; DataItem=’MainWindow’ (Name=»); target element is ‘UserControl1′ (Name=’me’); target property is ‘SelectedName’ (type ‘String’)
0 |
Жуткая тВарЬ 391 / 326 / 135 Регистрация: 06.02.2015 Сообщений: 962 Записей в блоге: 1 |
|
04.11.2015, 20:56 |
4 |
Так перенесите свойство в клпасс окна… Вы вообще про привязку читали? Добавлено через 6 минут
1 |
Igorian 1 / 1 / 0 Регистрация: 22.11.2013 Сообщений: 19 |
||||||||
05.11.2015, 18:57 [ТС] |
5 |
|||||||
Извиняюсь, но я новичок в этом деле и пытаюсь понять, как это работает. Вот написал ->
Ошибка исчезла, но проблема с передачей данных осталась. Т.е. если нажимаешь на строку таблицы 1Контрола, ничего не происходит во 2ом Контроле. А как тогда должна инфа передаваться в этот 2ой контрол ->
Изначально я передавал данные из SelectedName(1Контрол) в name (Главного окна), затем из name(Главного окна) передавалось в DisplayName(2го Контрола). А теперь чего делать? Сейчас из SelectedName(1Контрол) в DataContext.name (Главного окна), затем из … что куда должно передаться, чтоб отобразилось во 2омКонтроле?
0 |
Жуткая тВарЬ 391 / 326 / 135 Регистрация: 06.02.2015 Сообщений: 962 Записей в блоге: 1 |
|
05.11.2015, 20:20 |
6 |
Igorian, Вам быпочитать про mvvm, принципы построения слобосвязанных приложений и много чего еще, но это кучу времени потратите, но оно тогг стоит. Так, что если есть время то начните чтение с внедрения зависимостей ибо на этом принципе и паттерне стратегия уйма всего устроено… Ну естественно по wpf тоже надо читать, но не так много… Я могу Вам накидать пример под Вашу задачу, только опишите что хотите получить от работы программы, применение юзерконтролов у вас не обоснованно и не нужно
1 |
1 / 1 / 0 Регистрация: 22.11.2013 Сообщений: 19 |
|
05.11.2015, 21:30 [ТС] |
7 |
Спасибо за инфу о том, что нужно почитать. Это я обязательно сделаю. Насчет необоснованных контролов — да, я согласен, в этом примере они не нужны, но у меня есть приложение, в котором я использую avalonDock. Там нужны контролы, которые будут подгружаться в качестве отдельных окон и которые будут использоваться в разных местах. А этот пример я взял для того, чтобы понять, как это дело работает. Я делал все это дело без viewModel, все получилось, а вот когда я использую viewModel, вот ничего и не получается. Задача у меня такая — Есть 2 Контрола: — 1Контрол — Таблица listBox/ListView(В ней выбирается строка для отображения во втором контроле), 2Контрол — Label, в который записывается просто имя , выбранное из первого контрола. И все это связано через MainWindow. Потом я вместо имени буду данные из базы закидывать и подружать
0 |
Жуткая тВарЬ 391 / 326 / 135 Регистрация: 06.02.2015 Сообщений: 962 Записей в блоге: 1 |
|
06.11.2015, 10:17 |
8 |
В общем накидал пример, единственное, что я решил сделать с использованием аггрегатора событий из библиотеки призм (короче надо устанавливать через Nuget пакет Prism.PubSubEvents) — зато он убирает кучу всякой хрени в которой можно запутаться (в частности излишнюю управляющую вьюмодель и колбэки с подписками) Так же прощу обратить внимание, что есть специальный класс Boot в котором назначаются вьюмодели для наших контролов — ТАК ДЕЛАТЬ НЕЛЬЗЯ — но поскольку я не стал нагружать проект еще и контейнером внедрения зависимости, мне показалось, что такой подход будет понятнее… AggregateMVVM.zip П.С. На самом деле «по настоящему» все делается немножко сложнее (и в тоже время легче если знаешь материал), но для этого надо знать хотя бы про Внедрение зависимостей в .Net и несколько паттернов
1 |
1 / 1 / 0 Регистрация: 22.11.2013 Сообщений: 19 |
|
07.11.2015, 10:04 [ТС] |
9 |
amarf, Спасибо огромное за написанный вами пример!
0 |
Hello,
I have changed the title of my question because I don’t understand this error in the binding with the view.I know how to read it,but i don’t understand it’s cause or how should I change the syntax for it in a proper solution.This is my method for storing values:
View-Model:
public void SaveTeacher(object param) { using (DatabaseStudentsEntitiesLastStand db = new DatabaseStudentsEntitiesLastStand()) { RegisterTeacher t = new RegisterTeacher(); if (isChecked == true || t.CourseName != null) { t.CourseName = courseName; } t.SNTeacher = SNTeacher; t.UserName = _UserName; t.pwd = pwd; t.fullName = fullName; t.education = education; db.RegisterTeachers.Attach(t); try { db.SaveChanges(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
This is the isChecked property:
private bool isChecked; public bool IsChecked { get { return IsChecked; } set { if (isChecked != value) { isChecked = value; NotifyOnPropertyChange("IsChecked"); } } } private DelegateCommand checkCommand; public DelegateCommand CheckCommand { get { if (checkCommand == null) checkCommand = new DelegateCommand(SaveTeacher, null); return checkCommand; } set { checkCommand = value; NotifyOnPropertyChange("CheckCommand"); } }
This is the binding with the view:
<Button Content="Submit" Command="{Binding SaveCommand}" HorizontalAlignment="Left" Margin="517,98.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="110" Height="40"/> <Button Content="Cancel" HorizontalAlignment="Left" Margin="361,98.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="111" Height="40"/> <ListBox HorizontalAlignment="Left" Name="coursesList" Height="240" Margin="418,13.2,0,0" Grid.Row="1" VerticalAlignment="Top" Width="225" Grid.RowSpan="2" ItemsSource="{Binding Courses}" > <ListBox.ItemTemplate> <DataTemplate> <CheckBox x:Name="CheckBoxCourses" Click="CheckBoxCourses_Click" IsChecked="{Binding Path=IsChecked,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Command="{Binding CheckCommand,Mode=TwoWay}" Content="{Binding Path=courseName,Mode=TwoWay}" Margin="0"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
This is the Checked event:
private void CheckBoxCourses_Checked(object sender, RoutedEventArgs e) { var checkbox = sender as CheckBox; if(checkbox!=null) { checkbox.IsChecked =true; } }
What I have tried:
This is the entire error:
System.Windows.Data Error: 40 : BindingExpression path error: 'IsSelected' property not found on 'object' ''Cours' (HashCode=44335814)'. BindingExpression:Path=IsSelected; DataItem='Cours' (HashCode=44335814); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1')
I have tried multiple solutions with delegatecommand,selecteditem in the listbox and IsSelected property,read-only properties,nothing is working.Since I have tried many approaches,I have moved the property IsChecked from the view-model to the model class named «Cours» along with NotifyPropertyChanged(so it basically looks like the one I have in my example,only that it is in the model,not vm).Can someone please tell me what would be the problem based on this error?Please notify me if you need certain lines of code.
Only Visible to You and DevExpress Support
Visible to All Users
Modify
support ticket and change its visibility
Urgent
Duplicate
We have closed this ticket because another page addresses its subject:
Answers approved by DevExpress Support
Disclaimer: The information provided on DevExpress.com and affiliated web properties (including the DevExpress Support Center) is provided «as is» without warranty of any kind. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.
Confindential Information: Developer Express Inc does not wish to receive, will not act to procure, nor will it solicit, confidential or proprietary materials and information from you through the DevExpress Support Center or its web properties. Any and all materials or information divulged during chats, email communications, online discussions, Support Center tickets, or made available to Developer Express Inc in any manner will be deemed NOT to be confidential by Developer Express Inc. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.
Recently viewed tickets
You have yet to view any tickets.
Your search criteria do not match any tickets.
A server error occurred while processing your request. Please try again at a later time.