2017-04-22 20 views
0

目前我的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的現在集合改變內在價值,但二傳手仍然沒有叫上一個價值

回答

0

改變你需要爲MyClass實現INotifyPropertChanged接口,並在setter中引發PropertyChanged以通知UI該屬性值已更改。

+0

THX的答案,改變了代碼,現在集合改變內在價值,但觀察集合的制定者依然沒有解僱 – Kinni

+0

如果你正在創建新的集合,而不是你需要對集合的屬性做同樣的事情。否則UI將不會收到有關更改的通知,並將使用舊收集作爲數據源。 –

+0

我想我知道你的意思,但我不知道如何實現它,你能給我一個提示或代碼示例嗎? – Kinni

0

我怎麼知道哪些因素是目前

選擇如果你想爲你必須使用其他的控制項目選擇的支持。 ItemsControl不支持選擇。

例如使用ListView。將ItemsSource和SelectedItem綁定到你的類。現在,每次點擊某個項目時,SelectedValue都會更新。如果您從代碼更改了SelectedValue,UI將更新列表中的所選項目。您也可以將其他控件綁定到SelectedValue,就像我使用ListView外的TextBlock一樣。

查看

<StackPanel> 
    <ListView ItemsSource="{Binding Values}" SelectedItem="{Binding SelectedValue}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Path=Item1}" /> 
        <TextBlock Text="=" /> 
        <TextBlock Text="{Binding Path=Item2}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <StackPanel Orientation="Horizontal"> 
     <TextBox Text="Selected:" Background="DarkGray" /> 
     <TextBox Text="{Binding SelectedValue.Item1, Mode=OneWay}" Background="DarkGray" /> 
    </StackPanel> 
</StackPanel> 

數據

public class ListViewBindingViewModel : INotifyPropertyChanged 
{ 
    private Tuple<string,int> _selectedValue; 

    public ObservableCollection<Tuple<string,int>> Values { get; } 

    public Tuple<string, int> SelectedValue 
    { 
     get { return _selectedValue; } 
     set 
     { 
      _selectedValue = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedValue))); 
     } 
    } 

    public ListViewBindingViewModel() 
    { 
     Values = new ObservableCollection<Tuple<string, int>> {Tuple.Create("Dog", 3), Tuple.Create("Cat", 5), Tuple.Create("Rat",1)}; 
    } 

} 
相關問題