|
You need to raise a property changed event that tells WPF that the value it has bound to has changed. WPF isn't magic - it doesn't watch values to see if they have changed, it relies on you the developer telling it that the value has changed. So, to fix this, you need to implement INotifyPropertyChanged like this:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
}
private void Button_click(object sender, RoutedEventArgs e)
{
Age = Age == 10 ? 11 : 10;
}
private static int age = 10;
public static int Age
{
get { return age; }
set
{
if (age == value) return;
age = 10;
RaisePropertyChanged("Age");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
} Now, I don't really see any reasons why your property has to be static. Also, if I were writing this, I'd look at writing this using MVVM, so the logic of maintaining Age would be moved away from the code behind of the view all together.
|
|
|
|
|
You won't be able to call the non-static RaisePropertyChanged event from the setter of a static property.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Doh! Of course not. I was that busy thinking that I wouldn't use a static property that I got stuck in that mindset.
|
|
|
|
|
Pete's answer is almost there, except you can't raise a non-static event from the setter of a static property.
Pete Brown has the solution:
There are two ways to notify the binding system of property changes, both of which follow the same pattern as their instance-based relatives. The first is to create a static event named <propertyName>Changed . The second approach is to create a single event which is the static version of the INPC PropertyChanged event named StaticPropertyChanged .
So in your code, you would either have:
public static event EventHandler AgeChanged;
static int age = 10;
public static int Age
{
get { return age; }
private set
{
age = value;
var handler = AgeChanged;
if (handler != null) handler(null, EventArgs.Empty);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Age = (Age == 10) ? 11 : 10;
}
or:
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static void NotifyStaticPropertyChanged(string propertyName)
{
var handler = StaticPropertyChanged;
if (handler != null) handler(null, new PropertyChangedEventArgs(propertyName));
}
static int age = 10;
public static int Age
{
get { return age; }
private set
{
age = value;
NotifyStaticPropertyChanged("Age");
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Age = (Age == 10) ? 11 : 10;
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hi,
I'm building an application which uses a RichTextBox (in WPF). The problem is that the richtextbox is slow, much slower than a TextBox for sure, even slower than WordPad... May I ask you if you have had this issue? I've tried to search for this problem: Microsoft knows it, but it does not seem to solve it as I've been having this problem since I've used RichTextBox for the first time in WPF.
Thanks
Lusvardi Gianmarco
|
|
|
|
|
Sadly, the WPF version of the RTB is mind numbingly slow. Unfortunately there is no known cure for it.
|
|
|
|
|
What about using the winform version in wpf using a WinformHost? Could it be a better solution?
thanks!!
Lusvardi Gianmarco
|
|
|
|
|
It's pretty much a different beast, so you'd have to play around with it to see if it fits your needs.
|
|
|
|
|
I have a listbox with buttons and textblocks in its Data Template.
If I don't first click the list item, clicking the buttons operates on the wrong list item
Can I somehow automatically select the list item from within the data template?
Thanks
If it's not broken, fix it until it is
|
|
|
|
|
You can use the button DataContext instead of the list SelectedItem to obtain the correct object to operate on
Alternatively you can apply an ItemContainerStyle where you attach a PreviewMouseDown event in which you change the SelectedItem ![Smile | :)](https://codeproject.freetls.fastly.net/script/Forums/Images/smiley_smile.gif)
|
|
|
|
|
I have a button who's comman's CanExecute is set to SelectedPhone != null.
When I click the button, the listbox seems to lose focus, and then SelectedItem is null, so the button becomes disabled.
How do I keep the listbox from losing focus, or SelectedItem from becoming null?
Thanks
If it's not broken, fix it until it is
|
|
|
|
|
I have a Company object, and it has a list of Phones on it.
In the UI, I have a Company listbox. The listbox's data template contains company info UI elements, as well as a second listbox with Phone numbers.
How do I set the ItemSource of the Phones listbox to the Company list's Phones collection?
I have this for the Company listbox:
<ListBox Grid.Row="2"
x:Name="AddressList"
ItemsSource="{Binding Addresses}"
SelectedItem="{Binding SelectedAddress}"
BorderBrush="Transparent"
BorderThickness="0"
Visibility="Visible"
Margin="5">
and this for the Phone listbox:
<ListBox Grid.Row="1"
ItemsSource="{Binding DataContext.SelectedAddress.Phones, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
Background="LightSalmon"
MinHeight="100"
BorderThickness="0"
Margin="5">
Problem is, when the selected item changes on the Company listbox, I see the same phone numbers in each phone section.
What's the right way to do this?
Thanks
If it's not broken, fix it until it is
modified 9-Jun-14 15:51pm.
|
|
|
|
|
I am designing this UI[^].
A location can have one or more addresses. Each address can have one or more Phones, Emails, and Internets. Clicking a location in the tree will load all addresses for that location.
The center "Address" area is a listbox. The ListItem's DataTemplate is comprised of an outer expander with the Street Address area.
Under that are the 3 other expanders for Phones, Emails, and Internets. Each of those expanders contains the Add/Remove buttons and a listbox. The ListBox's Data Template contains the controls for that area.
So far, pretty straight forward.
Ok, now the problem. See this[^]
The Address list is bound to an ObservableCollection<companyinfoheaderentity> called Headers. The CompanyInfoHeaderEntity contains an ObservableCollection<phoneentity> of PhoneEntities called Phones.
It's a typical hierarchical data model.
So why is the SelectedItem of the parent getting data from other Addresses?
Is there a better way to design this?
Thanks
If it's not broken, fix it until it is
|
|
|
|
|
I have a project with me, pls contact me to send the project.
|
|
|
|
|
That is not how it works. No one is going to take a "project" from an unknown source containing who knows what, debug it for you, fix it for you and send it back to you. You need to edit your posting to include a proper description of your problem.
|
|
|
|
|
Hi Chaps (and chapettes)
annoyance - when i am building my WPF app in VS 2013 - i have a form that keeps loading(and displaying) when i build if i have that from's XAML in the designer
whats the fix here?
cheers
Bryce
MCAD
---
|
|
|
|
|
There isn't a fix. This is the way Visual Studio works.
|
|
|
|
|
Switch to a different tab, something other than the XAML, before you build
If it's not broken, fix it until it is
|
|
|
|
|
I have a listbox with a data template[^] with a bunch of controls in it.
When I click a list box item OUTSIDE the template, I get the list item selected. You can see the blue bar around it.
But, if I start by clicking any item INSIDE the data template, the list item is NOT selected.
How do I solve this?
Thanks
If it's not broken, fix it until it is
|
|
|
|
|
I am creating a WPF desktop application to be run on both Windows 7 and Windows 8, and on both desktop computers and tablets. I need to pop up the on-screen keyboard (osk.exe) when a TextBox control GotFocus but only if no physical keyboard is connected.
I am using GetRawInputDeviceList() and GetRawInputDeviceInfo() functions to find the keyboard devices.
When I run my app on the Surface Pro without physical keyboard attached it detects one keyboard with the following information:
Keyboard:
Name = \\?\HID#VID_045E&PID_079C&MI_01&Col03#8&c93f0be&0&0002#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
Handle: = 18024907
KeyboardMode = 1 | NumKeysTotal = 6 | Subtype = 0 | Type = 81 | VendorID 81 | Usage 0 | ProductID 0 | VersionNumber 1 | NumIndicators 3
When I run it on the Surface Pro with physical keyboard attached it detects two keyboards with the following information:
Keyboard:
Name = \\?\HID#VID_045E&PID_079C&MI_02&Col01#8&17434d04&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
Handle: = 43648689
KeyboardMode = 1 | NumKeysTotal = 154 | Subtype = 0 | Type = 81 | VendorID 81 |Usage 0 | ProductID 0 | VersionNumber 1 | NumIndicators 3
Keyboard:
Name = \\?\HID#VID_045E&PID_079C&MI_01&Col03#8&c93f0be&0&0002#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
Handle: = 18024907
KeyboardMode = 1 | NumKeysTotal = 6 | Subtype = 0 | Type = 81 | VendorID 81 | Usage 0 | ProductID 0 | VersionNumber 1 | NumIndicators 3
The only difference between these two keyboards is the numberOfKeysTotal field: one is 154, the other is 6.
My question:
How can I tell if a keyboard device is physical or virtual? By NumberOfKeysTotal?
Thanks.
|
|
|
|
|
That's a "feature" of virtual devices that they try to look as "physical" as possible... It may be impossible to differentiate between a virtual and real keyboard.
Some hints to the values you saw:
\\?\HID it is a "Human Interface Device"
VID_045E the Vendor Identifier is 045e (a hexadecimal value)
PID_079C the Product Identifier is 079c (the vendor sets the identifier of their products)
Strange that both keyborads have the same ids... (copy paste error?)
|
|
|
|
|
No copy error. The properties for the physcal and virtual keyboards are identical except for the number of keys total property. The physical one has 154 keys while the virtual has 6 keys.
|
|
|
|
|
Hello,
I need to play multiple instances of a same media file on a system and delete the file whenever last instance is deleted/closed.
There is no UI involved in it and media is played/stopped on some triggers.
I have been able to play the file using MediaElement and I am able to listen to same song in parallel and stop them individually.
The issue occured while deletion of the media file.
MediaElement doesn't release the filestream on MediaElement.Close() and the file is not deleted. It gets deleted only after application is closed.
I feel it to be a timing issue between MediaElement.Close() and File.Delete() as it happens intermittently.
I wanted to delete the file in order to create memory by deleting unused file(s).
It can be reporduced by creating atleast 2 MediaElement whose Source(Uri) refer to same media file.
After playing both the MediaElement, we close the media and delete the file(s). Sometimes it deletes the file, sometime doesn't.
Appreciate any thoughts on this issue of file being locked by the MediaElement and unable to delete instantly.
Thanks in advance!
Praveen Raghuvanshi
Software Developer
|
|
|
|
|
Yes; it sounds like a "timing" issue (since it happens "sometimes"). Some things (like I/O) can happen asynchronously.
I would "queue" the name of the file and delete it on a separate thread; in a limited "retry" loop that sleeps a few milliseconds between tries. Run a timer / counter to see the best and worst case to satisfy your curiosity.
|
|
|
|
|
Thanks!!!
Praveen Raghuvanshi
Software Developer
|
|
|
|