|
Do you prefer to have your ViewModels hold an instance of a DTO, then bind to that DTO's properties, or do you list out the properties you want to bind to and populate them from the DTO?
Why?
If it's not broken, fix it until it is
|
|
|
|
|
I don't use DTOs, I use collection properties of the view model, and make the child objects have the structure of the data I want to get to. Then I can just either iterate through the children for a list, or select using linq the child I need and use the properties of the child object
ChildObjectClass instance=ViewModelName.ChildObjectCollection.Where(c=>Someproperty==MatchThis Value).FirstOrDefault<ChildObjectClass>();
And in the HTML:
<p>Here is the value of my property: @instance.Property</p>
|
|
|
|
|
Hello Everyone,
I am having a listbox control in my app which is also having datatemplate inside and everything is fine until here. My problem starts when i want to change border background color on different databind for tag property of checkbox [please see datatemplate trigger in below code to understand what i am trying to achieve]. Please help me out.
Comment part in below code are the options i am trying to use but unfortunately not workking
<ListBox Name="listBoxDraftVersions" Height="200" Width="250" Margin="3" ItemsSource="{Binding DraftList}" SelectionMode="Multiple" SelectionChanged="listBoxDraftVersions_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<Border x:Name="TheBorder" BorderBrush="Gray" BorderThickness="1" Padding="4" CornerRadius="4" Margin="2">
<CheckBox Name="radioButZone" Content="{Binding DraftName}" Tag="{Binding FunctionCode}" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}">
</CheckBox>
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="AliceBlue" Offset="0.15" />
<GradientStop Color="White" Offset="0.85" />
<GradientStop Color="Lavender" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<!--<Border.Style>
<Style>
<Style.Triggers>
<Trigger Property="" Value="CMDSDMODIFYFEATURES">
<Setter Property="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}, Path=Background}" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>-->
</Border>
<!--<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Tag}" Value="CMDSDMODIFYFEATURES">
<Setter TargetName="TheBorder" Property="Background" Value="Blue" />
</DataTrigger>
</DataTemplate.Triggers>-->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
|
|
|
|
|
It looks as if you aren't specifying the trigger correctly. It has a value to look for, but it doesn't know of what it is the value. Perhaps if you give it the ElementName and Property as well as the value, then it can know where to look for the situation in which to fire the trigger.
Joey
Joseph M. Morgan
Lairhaven Enterprises
Waynesboro, Virginia, USA
|
|
|
|
|
Hi Joseph,
Thanks for your prompt response but i am unable to understand what are you trying to say!! Sorry i am bit new in WPF
Can you please help me in fixing this code as i have already shared code in my last post. What exactly has to be done??
Regards
|
|
|
|
|
Saurabh18cs wrote: Sorry i am bit new in WPF
So am I, unfortunately. What I understand about a trigger is that it has to know three things: What condition fires it, what the source of that condition is, and what to do when it fires.
From my understanding of your code, you are setting the first and the third but not the second. Where you have
<Trigger Property="" Value="CMDSDMODIFYFEATURES">
I think you need to set that property, so it knows where to look for the value "CMDSDMODIFYFEATURES" on that property.
I hope that is clearer--I am going by a very new understanding of WPF.
Joey
|
|
|
|
|
Hi Joey,
Thanks for this explanation , so in my case this is what i am doing :
<!--<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Tag}" Value="CMDSDMODIFYFEATURES">
<Setter TargetName="TheBorder" Property="Background" Value="Blue" />
</DataTrigger>
</DataTemplate.Triggers>-->
My Doubts here??
1) Is datatemplate triggers is correct place to accomplish my work? or some other way like i tried border.style triggers??
2) If datatemplate trigger is a correct way then as per your definition of triggers
Binding="{Binding Tag}" --> This is source
Value="CMDSDMODIFYFEATURES" --> fire if value matches CMDSDMODIFYFEATURES
<Setter TargetName="TheBorder" Property="Background" Value="Blue" /> --> do this stuff
I can see all 3 conditions are meeting here , so please correct me if i am missing something or what is the correct way to do this..
Note:: my checkbox is holding these values i.e. CMDSDMODIFYFEATURES under tag property Tag="{Binding FunctionCode}"
Regards
Saurabh
|
|
|
|
|
Here is an example from "WPF Succinctly" which is a free e-book from Syncfusion.
(I am not connected to them, so I am putting their library link here for everyone.)
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Border" Property="Background" Value="Purple" />
<Setter TargetName="Border" Property="BorderBrush" Value="DarkKhaki" />
</Trigger
According to the book, the data template or control template is the place to put the triggers.
Note that the property IsPressed is the property to be evaluated. In your case, it is the value of the check box, if I recall correctly. The Value property is the value you want that target property to have in order to fire the trigger. Without knowing your data structures, I am not sue what the binding is doing in your example. I am also not sure why you are using a tag instead of the value of the checkbox. If you use the template for the checkbox control, and the value of "true" is what you want to trigger the modifications, then you should be using this data template for the checkbox and use "True" on the Value property, I would think.
If I am wrong and you are selecting from multiple items as in a radio button group, then you would need to evaluate the value of the group and the trigger would be set on that.
Mind you, I am very new to WPF as well, so this is just my take on what the experts have written. I recommend both this book and some of the tutorials on line through Packtpub and Safari Online, if you have subscriptions to either.
Joseph M. Morgan ("Joey")
Lairhaven Enterprises/Solstice Systems
Waynesboro, Virginia, USA
|
|
|
|
|
Hi Joseph,
Thanks again for your response.
As a answer of your question, i am using tag property of checkbox because content property is already taken by another another binding property which i want to show on my checkbox. I want to fire trigger based on the tag property of checkbox because i have binded tag property to second property of binding.
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding FunctionCode}" Value="CMDSDMODIFYFEATURES">
<Setter TargetName="TheBorder" Property="Background" Value="{StaticResource MenuBackground}" />
</DataTrigger>
</DataTemplate.Triggers>
as per your post i have to use any property of datatemplate to fire, but what would be that property in my case? I am only passing binding and value as of now to my datatemplate.trigger
Wish you a very happy new year
|
|
|
|
|
Please help .. i am still not able to find way out
|
|
|
|
|
You're attempting to bind to a property that doesn't exist. Your Tag property is actually a property of the CheckBox which is, itself, bound to a different property on your ViewModel. So, you need to set your Trigger to use the underlying property. In other words, replace Binding="{Binding Tag}" with Binding="{Binding FunctionCode}" . If you'd checked your Output window when debugging your application, you'd probably have seen a binding error telling you that this was missing.
This space for rent
|
|
|
|
|
Hi Pete,
Thanks for your response!!
Actually , both ways xaml is not throwing error and neither working. As per your suggestion i have changed trigger i.e.
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding FunctionCode}" Value="CMDSDMODIFYFEATURES">
<Setter TargetName="TheBorder" Property="Background" Value="Blue" />
</DataTrigger>
</DataTemplate.Triggers>
Even after this change background color is not getting changed for checkbox holding tag value "CMDSDMODIFYFEATURES". Am i setting up a setter in correct way?
Regards
|
|
|
|
|
Someone please help me out achieving this ...
Regards
Saurabh
|
|
|
|
|
Hello Everyone,
I found the answer myself, here is how to achieve this :
<DataTemplate.Triggers>
<Trigger SourceName="radioButZone" Property="Tag" Value="CMDDSDMODIFYFEATURES">
<Setter Property="BorderBrush" Value="Orange" TargetName="TheBorder"/>
</Trigger>
</DataTemplate.Triggers>
Thanks everyone for your support
|
|
|
|
|
Hai
I want to create a simple WPF datagrid using vb.net. I added datagrid1 and added 2 columns from designer and binded it from xaml.
XAML
<DataGridTextColumn Binding="{Binding Path=LastName}" ClipboardContentBinding="{x:Null}" CanUserReorder="False" CanUserResize="False" Width="200" Header="LastName" HeaderStringFormat="LastName"/>
Second column
<DataGridTextColumn Binding="{Binding Path=FirstName}" ClipboardContentBinding="{x:Null}" Header="FirstName" HeaderStringFormat="FirstName" CanUserSort="False" CanUserReorder="False" CanUserResize="False" FontSize="16" Width="100">
I use this code
<pre lang="VB.NET">
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim _customers = New List(Of Customer)
DataGrid1.ItemsSource = _customers
End Sub
Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click
&#39;Here I want to add an empty row
End Sub
Public Class Customer
Private _firstName As String
Private _lastName As String
Public Property FirstName() As String
Get
Return _firstName
End Get
Set(ByVal value As String)
_firstName = value
End Set
End Property
Public Property LastName() As String
Get
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
End Class</pre>
My problem is an empty row is automatically added below, I want only to add row in button click event
Please tell me how to do this, or is there any method without using data source
Thanks
|
|
|
|
|
Try setting the
.CanUserAddRows property to false on the DataGrid.
|
|
|
|
|
Thanks for reply it is working
Also please tell me how to add a new row in button click
|
|
|
|
|
No it is a serious question - scenario...
WCF with a single data access class,
A data service class for each table/view in the database. This maps a datatable to the model
A model class for each table/view in the database to be passed in a List<> to the client - implements OnPropertyChanged
WPF client that uses the WCF and retrieves List<> of the models. The client is set to reuse the WCF objects (Models)
This means I do not have to remap the WCF models to client models, however chasing down a potential memory leak I find I have multiple copies of the models in memory. I have 1 particular view with 35 master lists (servicing comboboxes) and another 7 lists used for multi selects over 2 Tabs. Fricking nightmare! This view can take between 2 and 12 seconds to load and I'm attempting to find out why.
So the question should I be passing POCO objects from the WCF and converting them to local models with the OPC implementation?
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Why pass a POCO when only a scalar might be needed?
|
|
|
|
|
I pass all manner of objects, including scalar values. The point is that when I pass a list it is a List<> of a class with the OnPropertyChanged events included rather than a List<> of POCO objects. Is this likely to cause memory leaks?
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
The OnPropertyChanged handler is null until a presenter subscribes to it. Can't think of any other references that might cause a problem.
|
|
|
|
|
Tracked the problem down to the binding the selected object to the form, just too many comboboxes, the object has over 50 fields and binds to 30 comboboxes on the one view.
I gave them a couple of options, split the view or change to popups instead of combo boxes. The decided to live with the issue - bloody users.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
I used to "virtualize" these clumsy scenarios (combo boxes) into windows with data base smart grids.
|
|
|
|
|
How did you pop the windows, button or mouse over?
This is another option I am considering as there is a lot of looking but not a great deal of modification after the object is created.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
I'd pop the window on demand (e.g. F4 or a right-mouse click while a data-entry field has focus) or on trying to exit the field after typing an invalid entry. The intent was to minimize key strokes and mouse moves and maintain flow.
modified 27-Nov-15 20:37pm.
|
|
|
|