none
绑定源本身就是数据的时候怎么实现双向绑定? RRS feed

  • 问题

  •  private bool[] flag=new bool[3] { true,true,true};
    
            public bool[] Bits
            {
                get { return flag; }
                set { flag = value; RaisePropertyChanged(); }
            }


    <ItemsControl ItemsSource="{Binding Bits}" >
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Path=., Mode=TwoWay}" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=DataContext.CheckCmd}">
                                </CheckBox>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>

    绑定的集合本身就是数据 所以使用了Path=.

    但是这种形式是实现不了双向绑定的,即从target到Source是无效的。

    请问大家还有没有其他办法解决。

    <CheckBox IsChecked="{Binding Bits[0], Mode=TwoWay}"/>
                    <CheckBox IsChecked="{Binding Bits[1], Mode=TwoWay}"/>
                    <CheckBox IsChecked="{Binding Bits[2], Mode=TwoWay}" Command="{Binding CheckCmd}" />
    不要这种方式,因为我不止三个。

    2020年4月8日 2:39

全部回复

  • Hi,

    你在使用数组进行绑定,这样无法实现INotifyPropertyChanged,建议你使用List或者ObservableCollection,看我的代码:

      public partial class MainWindow : Window
        {
            MyViewModel mv = new MyViewModel();
           
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = mv;
            }
          
    
        }
        public class MyViewModel 
        {
           
            private List<MyClass> flag;
            public List<MyClass> Bits
            {
                get { return flag; }
                set { flag = value; }
            }
            public MyViewModel()
            {
                flag = new List<MyClass>();
                flag.Add(new MyClass() { Bit = true });
                flag.Add(new MyClass() { Bit = false });
                flag.Add(new MyClass() { Bit = true });
            }
    
        }
        public class MyClass : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private bool _bit;
            public bool Bit
            {
                get { return _bit; }
                set { _bit = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Bit")); }
            }
        }
     <ItemsControl ItemsSource="{Binding Bits}"  >
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Bit}">
                        </CheckBox>
                      
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

    Best Regards,

    Alex


    "Windows Presentation Foundation" forum will be migrating to a new home on Microsoft Q&A (Preview)!
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A (Preview)!
    For more information, please refer to the sticky post.

    2020年4月8日 6:48
  • 好的 多谢。
    2020年5月27日 7:24