目前我的ViewModel中有MyClass的ObservableCollection。我使用此Collection的getter來填充其他數據源。我現在可以在一個窗口(網格)中顯示這個數據,並顯示正確的數據,但是當我更改數據時,該集合未被觸發(我認爲這是因爲沒有更改集合,只有集合中的元素)。我應該創建MyClass的每個屬性的屬性,所以我可以爲單個值的變化作出反應,我問自己的問題是:C#Wpf綁定到用戶定義的類的集合不按預期方式工作
- 我怎麼知道哪些因素在此刻選擇
- 如何填寫正確的收藏時,我有一個綁定到每一個項目
我也想到了一個事件時,我的集合被更改,但我不知道如何實現它的權利。
public ObservableCollection<MyClass<string>> SelectedParams
{
get
{
//Fill the Collection
}
set
{
//I think here i want to react to changed Textboxvalues in my View
}
}
public class MyClass<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private T _curValue;
private string _value1;
private string _value2;
public string Value1
{
get
{
return _value1;
}
set
{
if (_value1 != value)
{
_value1 = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value1)));
}
}
}
public string Value2
{
get
{
return _value2;
}
set
{
if (_value2 != value)
{
_value2 = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value2)));
}
}
}
public T curValue
{
get
{
return _curValue;
}
set
{
_curValue = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(curValue)));
}
}
public MyClass()
{
}
public MyClass(string val1, string val2, T curVal)
{
Value1 = val1;
Value2 = val2;
curValue = curVal;
}
}
的XAML代碼看起來是這樣的
<ItemsControl ItemsSource="{Binding SelectedParams}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding Value1}"/>
<Label Grid.Column="1" Content="{Binding Value2}"/>
<TextBox Grid.Column="2" Text="{Binding curValue, Mode=TwoWay}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
EDIT1:改變MyClass的,以INotifyPropertyChanged的現在集合改變內在價值,但二傳手仍然沒有叫上一個價值
THX的答案,改變了代碼,現在集合改變內在價值,但觀察集合的制定者依然沒有解僱 – Kinni
如果你正在創建新的集合,而不是你需要對集合的屬性做同樣的事情。否則UI將不會收到有關更改的通知,並將使用舊收集作爲數據源。 –
我想我知道你的意思,但我不知道如何實現它,你能給我一個提示或代碼示例嗎? – Kinni