WPF启用按钮组

时间:2015-08-14 14:10:27

标签: c# wpf

在第一列中,我有组列表(“First”,“Second”)。在第二列,我有5个按钮。我想在第一列中选​​择组后启用或禁用按钮组。如何在MVVM模式中执行此操作?

enter image description here

enter image description here

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new Data();
    }
}
public class Data
{
    public List<string> Items { get; set; }
    public Data()
    {
        Items = new List<string>();
        Items.Add("First");
        Items.Add("Second");
    }
}

的Xaml:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <ListView ItemsSource="{Binding Items}" Grid.Column="0">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding .}"></Label>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Content="First" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="21,24,0,0" VerticalAlignment="Top" Width="76" IsEnabled="False"/>
    <Button Content="Second" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="102,48,0,0" VerticalAlignment="Top" Width="76" IsEnabled="True"/>
    <Button Content="First" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="33,83,0,0" VerticalAlignment="Top" Width="76" IsEnabled="False"/>
    <Button Content="Second" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="126,93,0,0" VerticalAlignment="Top" Width="76" IsEnabled="True" RenderTransformOrigin="1.088,-0.075"/>
    <Button Content="Second" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="93,186,0,0" VerticalAlignment="Top" Width="76" IsEnabled="True"/>
</Grid>

1 个答案:

答案 0 :(得分:0)

创建您的VM类,如:

public class Data:INotifyPropertyChanged
{
    public ObservableCollection<MyRecord> Items
    {
       get{
            return _items;
       }
       set{
            _items=value;
            OnProperyChanged("Items")
        }
    }

    public Data()
    {
        Items = new ObservableCollection<MyRecord>()
        {
                new MyRecord(){Title:"First",IsEnable:false}),
                new MyRecord(){Title:"Second",IsEnable:false})
        };
    }

    //---------------------------------------------------------------
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnProperyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            var handler= PropertyChanged ;
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class MyRecord:INotifyPropertyChanged
{
    private int _title;
    private bool _isEnable;

    public int Title
    {
        get
        {
            return _title;
        }
        set
        {
            _title= value;
            OnProperyChanged("Title")
        }
    }

    public bool IsEnable
    {
        get
        {
            return _isEnable;
        }
        set
        {
            _isEnable= value;
            OnProperyChanged("IsEnable")
        }
    }

    //---------------------------------------------------------------
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnProperyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            var handler= PropertyChanged ;
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

现在,您Xaml将每个IsEnabled的{​​{1}}属性绑定到相应的属性...

您可以使用BooleanToVisibilityConverter编写以下代码:

Button

样品:

//First add BooleanToVisibilityConverter to the window resources


// When you know Items[0] is FIRST use some code like this>>
IsEnabled="{Binding Items[0].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" 
好的,在这一步之前,每件事都很好。现在,如果您将每个项目的<Grid> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <ListView ItemsSource="{Binding Items}" Grid.Column="0"> <ListView.ItemTemplate> <DataTemplate> <Label Content="{Binding .}"></Label> </DataTemplate> </ListView.ItemTemplate> </ListView> <Button Content="First" IsEnabled="{Binding Items[0].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="21,24,0,0" VerticalAlignment="Top" Width="76"/> <Button Content="Second" IsEnabled="{Binding Items[1].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="102,48,0,0" VerticalAlignment="Top" Width="76"/> <Button Content="First" IsEnabled="{Binding Items[0].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="33,83,0,0" VerticalAlignment="Top" Width="76"/> <Button Content="Second" IsEnabled="{Binding Items[1].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="126,93,0,0" VerticalAlignment="Top" Width="76" RenderTransformOrigin="1.088,-0.075"/> <Button Content="Second" IsEnabled="{Binding Items[1].IsEnable, converter={StaticResource BooleanToVisibilityConverter}}" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="93,186,0,0" VerticalAlignment="Top" Width="76"/> </Grid> 属性设为IsEnable,则按钮必须为TRUE,反之亦然。要执行它,您可以:

  • 在Data类中编写一个Command,并在每个List之间建立绑定 项目和命令。
  • 使用Enabled事件将Clicked项的ListView.SelectionChanged属性设为IsEnable注意:现在,TRUE中每个项目的类型为ListView