我有以下用户界面,您可以在左侧选择一个团队,然后在右侧编辑所选团队的属性。以下是演示此问题的示例方案:
团队列表存储为可观察的集合:
public class TeamList : ObservableCollection<Team>
{
public TeamList() : base() { }
}
左侧的团队列表正在填充/绑定:
SettingsWindow.xaml
<ListView ItemsSource="{Binding}" Grid.Column="0" Grid.Row="1" DisplayMemberPath="name"
SelectionChanged="ListTeamSelected" SelectionMode="Single">
<!--<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Foreground" Value="{Binding color}" />
</Style>
</ListView.ItemContainerStyle>-->
</ListView>
SettingsWindow.xaml.cs
public Team selectedTeam { get; set; }
public SettingsWindow()
{
teams = TeamManager.Instance().teamList;
this.DataContext = this.teams;
if (!Application.Current.Resources.Contains("selectedTeam"))
Application.Current.Resources.Add("selectedTeam", selectedTeam);
InitializeComponent();
}
正在填充和保存右侧的数据:
SettingsWindow.xaml.cs
private void ClickSaveData(object sender, RoutedEventArgs e)
{
selectedTeam.name = TeamName.Text;
selectedTeam.color = PrimaryColorPicker.SelectedColor;
selectedTeam.secondaryColor = SecondaryColorPicker.SelectedColor;
saved = true;
}
private void ListTeamSelected(object sender, RoutedEventArgs e)
{
selectedTeam = (Team)(sender as ListView).SelectedItems[0];
TeamInfo.Visibility = Visibility.Visible;
TeamName.Text = selectedTeam.name;
PrimaryColorPicker.SelectedColor = selectedTeam.color;
SecondaryColorPicker.SelectedColor = selectedTeam.secondaryColor;
}
双重问题:
我的数据绑定是否有任何问题导致此问题? (我是WPF的新成员)
如果没有,我有办法强制UI更新左侧的列表吗? (这对我来说似乎很模糊)
提前感谢您的任何帮助!
答案 0 :(得分:0)
我不知道让我的Team
类实现INotifyPropertyChanged。 This link非常有帮助和直截了当。对于从未使用过数据绑定的其他人来说,有几点需要注意:
您需要获取要通知的所有属性的getter和setter才能抛出该事件。
您需要使用私有变量来保存数据本身,否则setter会触发自身,导致堆栈溢出。
事件的参数是已更改的属性的公共名称,而不是私人名称和值。
感谢@ReggaeGuitar的答案!
答案 1 :(得分:0)
您的属性需要实现INotifyPropertyChanged接口以使数据绑定正常工作。 例如(来自http://wpftutorial.net/INotifyPropertyChanged.html)
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
PropertyChanged("Name");
}
}
private void PropertyChanged(string prop)
{
if( PropertyChanged != null )
{
PropertyChanged(this, new PropertyChangedEventArgs(prop);
}
}
我强烈推荐MVVM Light Toolkit用于任何MVVM工作(https://mvvmlight.codeplex.com/)。如果您使用MVVM Light Toolkit,那么您可以继承ViewModelBase
,然后实现这样的属性
private string _orgId;
public string OrgId
{
get { return _orgId; }
set { _orgId = value; RaisePropertyChanged("OrgId"); }
}