一、动态模板DataTemplate内,能用MVVM赋值,但是无法改变值,无法触发点击事件
解决:
1、需要改变 TextBox
或 ComboBox
的值,需绑定 UpdateSourceTrigger
属性
例如:
Text="{Binding Path=TextBoxValue,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
SelectedItem="{Binding Path=TextBoxValue,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
其他控件绑定值同理
2、需要在动态模板内执行 button
的点击事件,需配置 ElementName
属性,例如
Command="{Binding ElementName=Capture,Path=DataContext.SelectFile}"
其中ElementName
属性选择的是页面最上层Window
的x:Name
其他控件绑定事件同理
二、使用MVVM动态集合ObservableCollection
时,只能在model
减少或增加时,才能动态更改UI。而仅仅改变model
里某个字段时,UI并不会刷新
解决:
1、更改完ObservableCollection
里的model字段后,将ObservableCollection
动态集合赋值到List
里,随后用Clear
清空整个ObservableCollection
,再用foreach
遍历List
,逐行添加到ObservableCollection
,即可完成界面的刷新
2、
配置INotifyPropertyChanged
基类
例如:
public class UserViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual bool SetProperty<T>(ref T member, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(member, value))
{
return false;
}
member = value;
RaisePropertyChanged(propertyName);
return true;
}
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
重新设置model
例如:
public class TabData : UserViewModel
{
private int _num;
private bool _check;
private string _name;
public int num { get => _num; set => SetProperty(ref _num, value); }
public bool check { get => _check; set => SetProperty(ref _check, value); }
public string name { get => _name; set => SetProperty(ref _name, value); }
}
再使用ObservableCollection,任意改变model字段值都能主动刷新
public ObservableCollection<TabData> TabList { get;set; } = new ObservableCollection<TabData>();
三、ListView
隐藏标题栏
<ListView.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Visibility" Value="Collapsed"/></Style>
</ListView.Resources>