WPF binding ComboBox to values from two objects
Good afternoon,
I have an issue binding two objects to my combobox.
Technically, I'm trying to achieve this:
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
};
But including all the cool features of TwoWay binding, meaning that changing SelectedItem in ComboBox also changes it on the SelectedModel.
To achieve such thing, I've tried doing this:
<ComboBox x:Name="CustomersComboBox"
ItemsSource="{Binding Customers}"
DisplayMemberPath="FullName"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding Path=SelectedModel.Customer, Mode=TwoWay}",
SelectedValuePath="FullName"/>
Which didn't work nor display any error in the output console.
It's also worth pointing out that Customers is an observable collection of type 'Customer' whereas SelectedModel is of type 'Contract'.
Contracts have Customer attached to them via Contract.Customer.
I could easily provide this functionality with code behind but that kinda dodges the purpose of MVVM.
c# wpf
|
show 2 more comments
Good afternoon,
I have an issue binding two objects to my combobox.
Technically, I'm trying to achieve this:
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
};
But including all the cool features of TwoWay binding, meaning that changing SelectedItem in ComboBox also changes it on the SelectedModel.
To achieve such thing, I've tried doing this:
<ComboBox x:Name="CustomersComboBox"
ItemsSource="{Binding Customers}"
DisplayMemberPath="FullName"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding Path=SelectedModel.Customer, Mode=TwoWay}",
SelectedValuePath="FullName"/>
Which didn't work nor display any error in the output console.
It's also worth pointing out that Customers is an observable collection of type 'Customer' whereas SelectedModel is of type 'Contract'.
Contracts have Customer attached to them via Contract.Customer.
I could easily provide this functionality with code behind but that kinda dodges the purpose of MVVM.
c# wpf
Could you please specify what do you mean when you say it doesn't work? Does it not set the SelectedModel.Customer to the customer you select from the combobox? Does it throw any runtime exceptions?
– mobearette
Nov 22 at 21:21
@mobearette it shows no errors in the Error List nor Output - the selected item just stays blank until I manually select something.
– JCode
Nov 22 at 21:36
Try binding againstSelectedItem
instead ofSelectedValue
. Note that you useSelectedValuePath="FullName"
, which means thatSelectedValue
would work with string values (i am assuming FullName is a string property) and not withCustomer
objects.
– elgonzo
Nov 22 at 23:01
@elgonzo I've also tried binding SelectedItem aswell as creating an 'adapter' - a simple property called SelectedCustomer that returns in getter => SelectedModel.Customer' - no avail.
– JCode
Nov 23 at 6:41
If you use SelectedItem, make sure to not use SelectedValueSelectedValuePath. Make sure that the binding can actually find the SelectedCustomer property (it should probably be in the same viewmodel as theCustomers
collection property). Make sure NotifyPropertyChanged event is raised whenever the value represented by SelectedCustomer changes. Set breakpoints on the setter and getter of the SelectedCustomer property to verify that the binding mechanism is actually being able to access the property.
– elgonzo
Nov 23 at 10:49
|
show 2 more comments
Good afternoon,
I have an issue binding two objects to my combobox.
Technically, I'm trying to achieve this:
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
};
But including all the cool features of TwoWay binding, meaning that changing SelectedItem in ComboBox also changes it on the SelectedModel.
To achieve such thing, I've tried doing this:
<ComboBox x:Name="CustomersComboBox"
ItemsSource="{Binding Customers}"
DisplayMemberPath="FullName"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding Path=SelectedModel.Customer, Mode=TwoWay}",
SelectedValuePath="FullName"/>
Which didn't work nor display any error in the output console.
It's also worth pointing out that Customers is an observable collection of type 'Customer' whereas SelectedModel is of type 'Contract'.
Contracts have Customer attached to them via Contract.Customer.
I could easily provide this functionality with code behind but that kinda dodges the purpose of MVVM.
c# wpf
Good afternoon,
I have an issue binding two objects to my combobox.
Technically, I'm trying to achieve this:
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
};
But including all the cool features of TwoWay binding, meaning that changing SelectedItem in ComboBox also changes it on the SelectedModel.
To achieve such thing, I've tried doing this:
<ComboBox x:Name="CustomersComboBox"
ItemsSource="{Binding Customers}"
DisplayMemberPath="FullName"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding Path=SelectedModel.Customer, Mode=TwoWay}",
SelectedValuePath="FullName"/>
Which didn't work nor display any error in the output console.
It's also worth pointing out that Customers is an observable collection of type 'Customer' whereas SelectedModel is of type 'Contract'.
Contracts have Customer attached to them via Contract.Customer.
I could easily provide this functionality with code behind but that kinda dodges the purpose of MVVM.
c# wpf
c# wpf
asked Nov 22 at 20:56
JCode
476
476
Could you please specify what do you mean when you say it doesn't work? Does it not set the SelectedModel.Customer to the customer you select from the combobox? Does it throw any runtime exceptions?
– mobearette
Nov 22 at 21:21
@mobearette it shows no errors in the Error List nor Output - the selected item just stays blank until I manually select something.
– JCode
Nov 22 at 21:36
Try binding againstSelectedItem
instead ofSelectedValue
. Note that you useSelectedValuePath="FullName"
, which means thatSelectedValue
would work with string values (i am assuming FullName is a string property) and not withCustomer
objects.
– elgonzo
Nov 22 at 23:01
@elgonzo I've also tried binding SelectedItem aswell as creating an 'adapter' - a simple property called SelectedCustomer that returns in getter => SelectedModel.Customer' - no avail.
– JCode
Nov 23 at 6:41
If you use SelectedItem, make sure to not use SelectedValueSelectedValuePath. Make sure that the binding can actually find the SelectedCustomer property (it should probably be in the same viewmodel as theCustomers
collection property). Make sure NotifyPropertyChanged event is raised whenever the value represented by SelectedCustomer changes. Set breakpoints on the setter and getter of the SelectedCustomer property to verify that the binding mechanism is actually being able to access the property.
– elgonzo
Nov 23 at 10:49
|
show 2 more comments
Could you please specify what do you mean when you say it doesn't work? Does it not set the SelectedModel.Customer to the customer you select from the combobox? Does it throw any runtime exceptions?
– mobearette
Nov 22 at 21:21
@mobearette it shows no errors in the Error List nor Output - the selected item just stays blank until I manually select something.
– JCode
Nov 22 at 21:36
Try binding againstSelectedItem
instead ofSelectedValue
. Note that you useSelectedValuePath="FullName"
, which means thatSelectedValue
would work with string values (i am assuming FullName is a string property) and not withCustomer
objects.
– elgonzo
Nov 22 at 23:01
@elgonzo I've also tried binding SelectedItem aswell as creating an 'adapter' - a simple property called SelectedCustomer that returns in getter => SelectedModel.Customer' - no avail.
– JCode
Nov 23 at 6:41
If you use SelectedItem, make sure to not use SelectedValueSelectedValuePath. Make sure that the binding can actually find the SelectedCustomer property (it should probably be in the same viewmodel as theCustomers
collection property). Make sure NotifyPropertyChanged event is raised whenever the value represented by SelectedCustomer changes. Set breakpoints on the setter and getter of the SelectedCustomer property to verify that the binding mechanism is actually being able to access the property.
– elgonzo
Nov 23 at 10:49
Could you please specify what do you mean when you say it doesn't work? Does it not set the SelectedModel.Customer to the customer you select from the combobox? Does it throw any runtime exceptions?
– mobearette
Nov 22 at 21:21
Could you please specify what do you mean when you say it doesn't work? Does it not set the SelectedModel.Customer to the customer you select from the combobox? Does it throw any runtime exceptions?
– mobearette
Nov 22 at 21:21
@mobearette it shows no errors in the Error List nor Output - the selected item just stays blank until I manually select something.
– JCode
Nov 22 at 21:36
@mobearette it shows no errors in the Error List nor Output - the selected item just stays blank until I manually select something.
– JCode
Nov 22 at 21:36
Try binding against
SelectedItem
instead of SelectedValue
. Note that you use SelectedValuePath="FullName"
, which means that SelectedValue
would work with string values (i am assuming FullName is a string property) and not with Customer
objects.– elgonzo
Nov 22 at 23:01
Try binding against
SelectedItem
instead of SelectedValue
. Note that you use SelectedValuePath="FullName"
, which means that SelectedValue
would work with string values (i am assuming FullName is a string property) and not with Customer
objects.– elgonzo
Nov 22 at 23:01
@elgonzo I've also tried binding SelectedItem aswell as creating an 'adapter' - a simple property called SelectedCustomer that returns in getter => SelectedModel.Customer' - no avail.
– JCode
Nov 23 at 6:41
@elgonzo I've also tried binding SelectedItem aswell as creating an 'adapter' - a simple property called SelectedCustomer that returns in getter => SelectedModel.Customer' - no avail.
– JCode
Nov 23 at 6:41
If you use SelectedItem, make sure to not use SelectedValueSelectedValuePath. Make sure that the binding can actually find the SelectedCustomer property (it should probably be in the same viewmodel as the
Customers
collection property). Make sure NotifyPropertyChanged event is raised whenever the value represented by SelectedCustomer changes. Set breakpoints on the setter and getter of the SelectedCustomer property to verify that the binding mechanism is actually being able to access the property.– elgonzo
Nov 23 at 10:49
If you use SelectedItem, make sure to not use SelectedValueSelectedValuePath. Make sure that the binding can actually find the SelectedCustomer property (it should probably be in the same viewmodel as the
Customers
collection property). Make sure NotifyPropertyChanged event is raised whenever the value represented by SelectedCustomer changes. Set breakpoints on the setter and getter of the SelectedCustomer property to verify that the binding mechanism is actually being able to access the property.– elgonzo
Nov 23 at 10:49
|
show 2 more comments
1 Answer
1
active
oldest
votes
Have you tried to RaisePropertyChanged?
RaisePropertyChanged(SelectedModel.Customer); to notify the UI that something has been changed in the model. Perhaps implement it upon the selection change. That way it will fire up the property bound to your view.
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
then
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
RaisePropertyChanged(nameof(SelectedModel.Customer));
};
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437887%2fwpf-binding-combobox-to-values-from-two-objects%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Have you tried to RaisePropertyChanged?
RaisePropertyChanged(SelectedModel.Customer); to notify the UI that something has been changed in the model. Perhaps implement it upon the selection change. That way it will fire up the property bound to your view.
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
then
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
RaisePropertyChanged(nameof(SelectedModel.Customer));
};
add a comment |
Have you tried to RaisePropertyChanged?
RaisePropertyChanged(SelectedModel.Customer); to notify the UI that something has been changed in the model. Perhaps implement it upon the selection change. That way it will fire up the property bound to your view.
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
then
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
RaisePropertyChanged(nameof(SelectedModel.Customer));
};
add a comment |
Have you tried to RaisePropertyChanged?
RaisePropertyChanged(SelectedModel.Customer); to notify the UI that something has been changed in the model. Perhaps implement it upon the selection change. That way it will fire up the property bound to your view.
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
then
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
RaisePropertyChanged(nameof(SelectedModel.Customer));
};
Have you tried to RaisePropertyChanged?
RaisePropertyChanged(SelectedModel.Customer); to notify the UI that something has been changed in the model. Perhaps implement it upon the selection change. That way it will fire up the property bound to your view.
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
then
CrudGrid.SelectionChanged += (o, e) =>
{
CustomersComboBox.SelectedItem = SelectedModel?.Customer;
RaisePropertyChanged(nameof(SelectedModel.Customer));
};
answered Nov 22 at 23:33
Joseph Meris
226
226
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437887%2fwpf-binding-combobox-to-values-from-two-objects%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Could you please specify what do you mean when you say it doesn't work? Does it not set the SelectedModel.Customer to the customer you select from the combobox? Does it throw any runtime exceptions?
– mobearette
Nov 22 at 21:21
@mobearette it shows no errors in the Error List nor Output - the selected item just stays blank until I manually select something.
– JCode
Nov 22 at 21:36
Try binding against
SelectedItem
instead ofSelectedValue
. Note that you useSelectedValuePath="FullName"
, which means thatSelectedValue
would work with string values (i am assuming FullName is a string property) and not withCustomer
objects.– elgonzo
Nov 22 at 23:01
@elgonzo I've also tried binding SelectedItem aswell as creating an 'adapter' - a simple property called SelectedCustomer that returns in getter => SelectedModel.Customer' - no avail.
– JCode
Nov 23 at 6:41
If you use SelectedItem, make sure to not use SelectedValueSelectedValuePath. Make sure that the binding can actually find the SelectedCustomer property (it should probably be in the same viewmodel as the
Customers
collection property). Make sure NotifyPropertyChanged event is raised whenever the value represented by SelectedCustomer changes. Set breakpoints on the setter and getter of the SelectedCustomer property to verify that the binding mechanism is actually being able to access the property.– elgonzo
Nov 23 at 10:49