WPF binding at runtime not working - wpf

Using .NET 4.7.1 WPF with MahApps 1.6.1.4. I'm binding the HamburgerMenuIconItem.Icon like this:
<controls:HamburgerMenuIconItem.Icon>
<Ellipse">
<Ellipse.Fill>
<ImageBrush ImageSource="{Binding Image}" />
</Ellipse.Fill>
</Ellipse>
</controls:HamburgerMenuIconItem.Icon>
In Design mode I can right click "Image" and go to the property in my ViewModel that is the UserControl.DataContext. As expected.
But in runtime this fails with this error:
System.Windows.Data Error: 40 : BindingExpression path error: 'Image' property not found on 'object' ''HamburgerMenuIconItem' (HashCode=44346036)'. BindingExpression:Path=Image; DataItem='HamburgerMenuIconItem' (HashCode=44346036); target element is 'ImageBrush' (HashCode=21345065); target property is 'ImageSource' (type 'ImageSource')
So at runtime it is trying to bind to a property in the "HamburgerMenuIconItem" or what? I can force the binding to the View code behind like this:
{Binding Path=Image, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}
Which works at runtime also, but I'd like the property in my ViewModel.
What am I misunderstanding?

Seems the issue is missing inheritance of the DataContext (but only at Runtime). The solution explained here solved my issue.

Related

Binding Error Reported with Converter in WPF Textbox

a textbox is either hidden or not depending on whether its text is null or not.
The actual hiding works ok but i keep getting a Data.Error as follows.
System.Windows.Data Error: 40 : BindingExpression path error: 'new_file_path' property not found on 'object' ''main_window_vm' (HashCode=44962972)'. BindingExpression:Path=new_file_path; DataItem='main_window_vm' (HashCode=44962972); target element is 'Run' (HashCode=28141317); target property is 'Text' (type 'String')
xaml is
<Padding="10" Visibility="{Binding Path=Text, RelativeSource={RelativeSource Self},
Converter={StaticResource null_to_viz}}">
<Run Text="Updated file path : " />
<Run Text="{Binding new_file_path}" />
any ideas to fix this error?
The issue is complaining about not finding new_file_path yet the example is binding to the property Text.
Most likely this converter is not failing and it is a different control. Investigate by either finding the right control which is not binding properly or verifying that textbox is actually binding to the proper VM.
seems like this error occurs when one foolishly set a property to private, not public. Which is why it was not able to be found.

WPF Element Binding

I have two controls within my UserControl where I bind to the exact same object using Element Binding:
AllowNext="{Binding ElementName=MainGrid, Path=DataContext.CanContinue}"
On the first control it works fine but on the second I get a binding exception:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=MainGrid'. BindingExpression:Path=DataContext.CanContinue; DataItem=null; target element is 'WizardPage' (Name='DeductionPage'); target property is 'AllowNext' (type 'Boolean')
I have also tried using RelativeSource binding on the second control:
AllowNext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext.CanContinue}"
But this also gives me an error.
Does anyone know what this might be?
--
Here is the simplified control:
<Grid Name="MainGrid">
<w:Wizard Name="MyWizard" w:Designer.PageIndex="1" DataContext="{Binding ElementName=MainGrid, Path=DataContext.Policy}" >
<w:WizardPage Header="Main Member" MaxHeight="600" AllowNext="{Binding ElementName=MainGrid, Path=DataContext.CanContinue}" Name="MainPage">
</w:WizardPage>
<w:WizardPage Name="DeductionPage" Header="Policy Details" AllowBack="False" AllowNext="{Binding ElementName=MainGrid, Path=DataContext.CanContinue}">
</w:WizardPage>
</w:Wizard>
</Grid>
Now as I mentioned, MainPage binds fine, whereas the DeductionPage does not bind at all and gets the supplied error. The DataContext of MainGrid is set from code behind:
public void SetDataContext(object o)
{
MainGrid.DataContext = o;
}
I bet it's the MainGrid which is the binding source is not in the logical tree of your binding target.
This is the problem absolutely with the binding element. However, you didn't give the source so You want to debug it and solve the issue.
Refer the below url and "Cannot find source for binding with reference" section where explained obviously how to debug and solve it.
http://www.codeproject.com/Articles/244107/Debugging-WPF-data-bindings

Binding to dependency property via PlacementTarget fails - wrong path syntax?

No problem
I created a dependency property which takes a string value. I set it on a TextBlock and it works:
<TextBlock dp:ElementDataContext.ElementName="LvMain">
I verified that the property ElementDataContext.ElementName is set to "LvMain".
Problem
Now here is the problem: in the TextBlock's context menu I want to bind to this dependency property via PlacementTarget.
Here is how I try to do it. This is an excerpt of my XAML containing TextBlock and ContextMenu:
<TextBlock dp:ElementDataContext.ElementName="LvMain">
<TextBlock.ContextMenu>
<ContextMenu Tag="{Binding PlacementTarget.(dp:ElementDataContext.ElementName), RelativeSource={RelativeSource Self}}">
This fails at runtime. When opening the context menu it gives me a "BindingExpression path error":
BindingExpression path error: '(dp:ElementDataContext.ElementName)' property not found on 'object' ''TextBlock' (Name='')'. BindingExpression:Path=PlacementTarget.(dp:ElementDataContext.ElementName); DataItem='ContextMenu' (Name='contextMenu'); target element is 'ContextMenu' (Name='contextMenu'); target property is 'Tag' (type 'Object')
I suspect my binding path is wrong. I tried
PlacementTarget.(dp:ElementDataContext.ElementName)
PlacementTarget.dp:ElementDataContext.ElementName
PlacementTarget.ElementDataContext.ElementName
Nothing works. What is the correct syntax? Is this even possible?
The property path syntax PlacementTarget.(dp:ElementDataContext.ElementName) is correct, but you also have to explicitly write the Path=... part in the property expression:
<ContextMenu Tag="{Binding Path=PlacementTarget.(dp:ElementDataContext.ElementName),
RelativeSource={RelativeSource Self}}">
However, the Implicit Path section in Binding Markup Extension does not mention this behaviour.

WPF Binding to Window property failing

I've got a custom control class in my project called "CarSystemWindow". It descends from Window and has a custom template that gives all windows in my application the same look. It also defines two dependency properties named DeviceName and DeviceType. These are of type string. They default to "Vehicle: " and "Car 54", respectively.
In my main program, I retrieve a row from my database into a View Model object and save that in a normal CLR property called Site during the program's initialization. In the MainWindow's xaml, I have the following code:
<cs:CarSystemWindow x:Class="....MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:..."
xmlns:cs="..."
Background="Black"
Closed="Window_Closed"
DataContext="{Binding Path=Site, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DeviceName="{Binding Path=SiteName}"
DeviceType="{Binding Path=SiteTypeName}"
Icon="..."
Height="600"
Loaded="Window_Loaded"
ResizeMode="CanMinimize"
SourceInitialized="Window_SourceInitialized"
Title="Window Title"
Width="800"
WindowStartupLocation="CenterScreen">
At run time, the binding on the DataContext attribute is failing with the following message:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=Site; DataItem=null; target element is 'MainWindow' (Name=''); target property is 'DataContext' (type 'Object')
I'm using this same binding code elsewhere and it works. I've even turned the Site property into a dependency property and its still failing.
Does anyone give have ideas why the binding is failing?
Thanks
Tony
I think you need to change your binding to this:
{Binding RelativeSource={RelativeSource Self}, Path=Site}
The reason your current binding is not working is that you are trying to go up a level in the hierarchy from the Window, but you actually want the Window.
Here is a good source for figuring out what the binding string should be for different scenarios:
http://www.nbdtech.com/Free/WpfBinding.pdf
The problem with the DataContext binding is that the line is saying to use the Site property on an object that is an ancestor of this object, and of type Window. Since this object is a Window already, and therefore at the root of the visual tree, there are no ancestors to search and find the specified property.
Why don't you assign the DataContext where this object is constructed?

The VS10 debugger says it cannot find the datasource column in Silverlight application

The error
System.Windows.Data Error: BindingExpression path error: 'secUserName' property not found on 'DevExpress.Xpf.Grid.EditGridCellData' 'DevExpress.Xpf.Grid.EditGridCellData' (HashCode=2852273). BindingExpression: Path='secUserName' DataItem='DevExpress.Xpf.Grid.EditGridCellData' (HashCode=2852273); target element is 'DevExpress.Xpf.Editors.TextEdit' (Name=''); target property is 'EditValue' (type 'System.Object')..
System.Windows.Data Error: BindingExpression path error: 'secUserName' property not found on 'DevExpress.Xpf.Editors.TextEdit' 'DevExpress.Xpf.Editors.TextEdit' (HashCode=19675928). BindingExpression: Path='secUserName' DataItem='DevExpress.Xpf.Grid.EditGridCellData' (HashCode=2852273); target element is 'DevExpress.Xpf.Editors.TextEdit' (Name=''); target property is 'EditValue' (type 'System.Object')..
The vb.net
Public Sub New()
InitializeComponent()
Me.Title = ApplicationStrings.HomePageTitle
'<!-- load the datagrid -->
Module1._Context.Load(Module1._Context.GetGESECsQuery())
GridControl1.DataSource = Module1._Context.GESECs
GridControl1.DataContext = Module1._Context.GESECs
End Sub
The XAML
<dxg:GridColumn Header="TRAIL" FieldName="secUserName" >
<dxg:GridColumn.DisplayTemplate>
<ControlTemplate>
<StackPanel>
<dxe:TextEdit EditValue="{Binding Path=secUserName}"></dxe:TextEdit>
</StackPanel>
</ControlTemplate>
</dxg:GridColumn.DisplayTemplate>
</dxg:GridColumn>
Problem
When the edittext is clicked (there by bringing the row in edit mode {with the pencil diagram on its side}) the content of the SECUSERNAME is displayed
But in the normal condition of just displaying the records, the textedit does not display anything.
Yes, the debugger show that the secusername is not valid, but why? What should I do to make this right?
Please try to change your binding code as follows:
"{Binding Path= DisplayText, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
Does it work for you?

Resources