There are several possibilities you could try:
First, your ListView may not update your ViewModel SelectedUser property. Try setting the binding in your ListView to "TwoWay" mode:
<ListView x:Name="lstAccounts" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Grid.RowSpan="4" ItemsSource="{Binding Source={StaticResource UserData}, Path=CurrentUserSearch}" SelectedItem="{Binding Source={StaticResource UserData}, Path=SelectedUser, Mode=TwoWay}"/>
You can better organize a way to define a DataContext. Remember that all child UserControl controls will have access to its DataContext without using relative binding (they inherit it). Since your PlayerInfo control is dependent on SelectedUser, consider setting the DataContext to SelectedUser by binding it to a SelectedUser ListView or SelectedUser in UserData view mode.
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4" DataContext="{Binding Source={StaticResource UserData}, Path=SelectedUser}" BalanceContent="{Binding Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> </Game:PlayerDetails>
The source of the current SelectedUser can also be a ListView:
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4" DataContext="{Binding SelectedItem, ElementName=lstAccounts}" BalanceContent="{Binding Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> </Game:PlayerDetails>
In any case, you can do the following in a TextBox, because its DataContext will be the same as its parent:
<TextBox VerticalAlignment="Center" FontFamily="Formata" FontSize="20" Grid.Column="2" Text="{Binding Balance}" Grid.Row="7"></TextBox>
If usercontrol depends on the root view model for things like commands and other high-level logic, then set the DataContext so that you can easily access SelectedUser.
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4" DataContext="{StaticResource UserData}" BalanceContent="{Binding SelectedUser.Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> </Game:PlayerDetails>
So you can do this:
<TextBox VerticalAlignment="Center" FontFamily="Formata" FontSize="20" Grid.Column="2" Text="{Binding SelectedUser.Balance}" Grid.Row="7"></TextBox>
In this second approach, however, you will need to check one thing, which I'm not sure about. I know that when you change the DataContext of the control, it will update all dependent bindings. For example, if you change the DataContext PlayerDetails to another instance of UserData, the BalanceContent property will also be updated. However, in this case, the BalanceContent depends on the SelectedUser UserData property. Therefore, it will listen for changes to the properties of this user instance. If SelectedUser.Balance changes (and the user implements INotifyPropertyChanged, or it is DependencyProperty), the BalanceContent will be updated. Now, if the instance of SelectedUser in UserData changes, I'm not sure that the BalanceContent will be updated, because I think the binding is not listening for changes to every object in its path.
EDIT
The last question was perhaps the first problem that I encountered while developing using xaml. I had a DataGrid in Silverlight whose object type had a property of a complex type. One of the columns depended on a property of a complex type. If I changed the value of a complex type, the column would update the penalty (it implemented INPC). If I changed the instance of a complex type of an object, the column would not be ... The solution was to cascade the DataContexts: I created a template column, set the column binding for the complex type, and not its property. Then I attached the text TextBox of my template to the complextype property, because now it is a TextCox DataContext.
In your case, you can do this for TextBox.Text, but not for PlayerDetails.BalanceContent. You can bind TextBox.DataContext to SelectedUser UserData and then bind text to the Balance property.
<TextBox VerticalAlignment="Center" DataContext="{Binding SelectedUser}" FontFamily="Formata" FontSize="20" Grid.Column="2" Text="{Binding Balance}" Grid.Row="7"></TextBox>