为了简要说明我的问题,我有一个标签,我想以" Item1,Item2,Item3等格式显示ObservableCollection列表的内容"。
所以我的XAML看起来像这样。代码缩短了可读性。
<Window.Resources>
<c:ListToString x:Key="ToList"></c:ListToString>
</Window.Resources>
<Label x:Name="yaxisTxt" Content="{Binding Path=YAxisVariables, Converter={StaticResource ToList}}">
YAxisVariables是ObservableCollection。我的VM看起来像这样,再次缩短。
class ChartVM : INotifyPropertyChanged
{
ObservableCollection<string> _yaxisvars;
public ObservableCollection<string> YAxisVariables
{
get
{
return (_yaxisvars);
}
set
{
_yaxisvars = value;
OnPropertyChanged("YAxisVariables");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string PropName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropName));
}
}
}
我的转换器看起来像这样。我希望标签显示&#34;拖动变量&#34;如果ObservableCollection为空,并显示集合的值,如果它不为空。
public class ListToString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is ObservableCollection<string>)
{
ObservableCollection<string> vars = (ObservableCollection<string>)value;
if (vars.Count > 0)
{
string series = null;
foreach (string var in vars)
{
if (series != null)
series = series + ", " + var;
else
series = var;
}
series.Trim(',');
series.Trim(' ');
return series;
}
else
return "Drag variable";
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我的问题是,当加载表单并且列表为空时,转换器正确触发并且标签显示&#34;拖动变量&#34;,但是当更新列表并且属性发生更改时,转换器会执行不要开火。
我错过了什么吗?
答案 0 :(得分:0)
对于集合,您需要3种绑定/更改通知:
其他注意事项:
您对属性名称字符串进行了硬编码。 C#添加了语法,所以你永远不必这样做。您肯定应该使用[CallerMemberName]和类似的东西来使您的代码重构安全并避免拼写错误。
实际上没有任何东西可以绑定到简单的集合。 WPF元素只能绑定到CollectionViews。但是如果你给他们一个随机的集合,他们就不会犹豫从它那里制作一个CollectionView。对于高级内容(更改/跟踪所选元素,过滤,排序),您必须控制该步骤并自行创建CollectionView:https://wpftutorial.net/DataViews.html