如何用Button替换Combobox绑定

时间:2013-10-05 18:43:18

标签: c# .net wpf itemscontrol

我的代码在.cs文件中定义的函数调用上生成面板。代码中使用ItemControl来生成这些面板。每个小组都有TextboxSliderCombobox

每个Panel的Slider和Combobox正在使用TextBox.Text,如:

  1. 滑块以增加Textbox.Text字体大小。

  2. Combobox选择TextBox.Text的对齐方式。

  3. 我想用内容为Left的Button替换Combobox。因此,当我点击按钮时,其内容必须更改为Right,类似地从Right更改为Left。,以对Alignment进行更改。

    任何人都可以解决我的问题吗?这里的代码是:

    XAML文件:

    <ItemsControl x:Name="lstItemsClassM" >
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                    <ComboBox x:Name="cboOccupation" IsEditable="False" HorizontalAlignment="Left"
            Text="{Binding Path=Alignment, Mode=TwoWay}"
            Margin="4" Width="140">
                            <ComboBoxItem>Right</ComboBoxItem>
                            <ComboBoxItem>Left</ComboBoxItem>
    
                        </ComboBox>
    
                        <Button Content="{Binding Alignment, Mode=TwoWay}" Click="Button_Click" Tag="{Binding PKId}" SourceUpdated="Button_SourceUpdated" />
                        <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" FontSize="{Binding FontSize, Mode=OneWay}" TextAlignment="{Binding Alignment, Mode=OneWay}"  />
                        <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" />
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    

    .cs文件

     public partial class Window2 : Window
    {
        protected ObservableCollection<ClassM> texts = new ObservableCollection<ClassM>();
        int dv;
        public Window2()
        {
            InitializeComponent();
            dv=1;
            texts.Add(new ClassM() { PKId=dv, Text = "Test 1" });
            dv=2;
            texts.Add(new ClassM() { PKId=dv, Text = "Test 2" });
    
            lstItemsClassM.ItemsSource = texts;
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var myValue = ((Button)sender).Tag;
          foreach (var f in texts.ToList())
                {
                    if (f.PKId.ToString() == myValue.ToString())
                    {
                        f._alignment = "Right";
                        MessageBox.Show(f._alignment);
                    }
                }
        }
    
        private void Button_SourceUpdated(object sender, DataTransferEventArgs e)
        {
            var myValue = ((Button)sender).Tag;
           foreach (var f in texts.ToList())
            {
                if (f.PKId.ToString() == myValue.ToString())
                {
                    f._alignment = "Right";
                    MessageBox.Show(f._alignment);
                }
            }
        }
    
    
    }
    
    
    public class ClassM : INotifyPropertyChanged
    {
        private string _id;
        private int _pkid;
        private string _text;
        private double _fontSize = 10;
        public bool _isChecked { get; set; }
        public string _alignment="Left";
    
        public int PKId
        {
            get { return _pkid; }
            set
            {
                if (value != _pkid)
                {
                    _pkid = value;
                    NotifyPropertyChanged();
                }
            }
        }
        public string Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    NotifyPropertyChanged();
                }
            }
        }
    
        public bool IsChecked
        {
            get { return _isChecked; }
            set
            {
                if (value != _isChecked)
                {
                    _isChecked = value;
                    NotifyPropertyChanged();
                }
            }
        }
        public string Text
        {
            get { return _text; }
            set
            {
                if (value != _text)
                {
                    _text = value;
                    NotifyPropertyChanged();
                }
            }
        }
        public double FontSize
        {
            get { return _fontSize; }
            set
            {
                if (value != _fontSize)
                {
                    _fontSize = value;
                    NotifyPropertyChanged();
                }
            }
        }
        public string Alignment
        {
            get { return _alignment; }
            set
            {
                if (value != _alignment)
                {
                    _alignment = value;
                    NotifyPropertyChanged();
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void NotifyPropertyChanged(String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    }

1 个答案:

答案 0 :(得分:1)

TextBox.TextAlignment属性的枚举类型为System.Windows.TextAlignment

如果要绑定它而不必实现自己的值转换器,那么您希望使用实际的枚举值填充ComboBox,而不仅仅是具有相同名称的字符串,如“Left”和“Right”... < / p>

以下是如何使ComboBox代表TextAlignment:

<ComboBox>
    <ComboBox.Items>
        <TextAlignment>Left</TextAlignment>
        <TextAlignment>Right</TextAlignment>
    </ComboBox.Items>
</ComboBox>

现在,您可以将ComboBox的SelectedItem属性绑定到TextBox的TextAlignment属性。

或者在您的情况下,如果要将两者绑定到基础数据上下文,则需要更改此内容:

private string _alignment = "Left";

对此:

private TextAlignment _alignment = TextAlignment.Left;