如何使用MVVMLight RelayCommands创建自定义控件WPF资源字典

时间:2013-06-13 13:22:25

标签: wpf xaml mvvm-light resourcedictionary relaycommand

我可以/如何将命令附加到我制作的自定义控件并将其放入WPF中的资源字典中?我想不在多个地方定义这个控件,也没有XAML的代码隐藏文件中的代码。这是我的控件的第一个再现,它基本上是一个可重新订购的复选框列表框。未选中的项目不能位于列表的顶部。

<ListBox Name="listBoxZone" Grid.Row="3" HorizontalContentAlignment="Stretch" Height="200"
                 ItemsSource="{Binding TheList}"  >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderThickness="0.5" BorderBrush="DarkGray">
                        <Grid Height="30">
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>

                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>

                            <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}" Click="Reorder_Click" Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Width="Auto"/>

                            <Button Click="UpDownClick" Name="Up"  Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Margin="1" ToolTip="Up" BorderBrush="{x:Null}" Background="{x:Null}">
                                <Image Source="/Resources/Icons/sort_up.png"/>
                            </Button>
                            <Button Name="Down" Click="UpDownClick" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" Margin="1" ToolTip="Down" BorderBrush="{x:Null}" Background="{x:Null}">
                                <Image Source="/Resources/Icons/sort_down.png"/>
                            </Button>

                        </Grid>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

目前只有代码隐藏的内容:

public TaskRolesView()
    {
        InitializeComponent();

        //remove later when i figure this out!
        CreateCheckBoxList();
        this.DataContext = this;
    }

    private System.Collections.ObjectModel.ObservableCollection<StoredProc> _theList;
    public System.Collections.ObjectModel.ObservableCollection<StoredProc> TheList
    {
        get { return _theList; }
        set
        {
            if (value != _theList)
            {
                _theList = value;
                FirePropertyChanged("TheList");
            }

        }
    }

    public void CreateCheckBoxList()
    {
        TheList = new System.Collections.ObjectModel.ObservableCollection<StoredProc>();

        StoredProc mea = new StoredProc();
        mea.Name = "MEA";
        mea.IsChecked = true;

        StoredProc valic = new StoredProc();
        valic.Name = "VALIC";
        valic.IsChecked = true;

        StoredProc axa = new StoredProc();
        axa.Name = "AXA";
        axa.IsChecked = true;

        StoredProc fidelity = new StoredProc();
        fidelity.Name = "Fidelity";
        fidelity.IsChecked = true;

        StoredProc first = new StoredProc();
        first.Name = "Step 1";
        first.IsChecked = true;

        StoredProc second = new StoredProc();
        second.Name = "Step 2";
        second.IsChecked = false;

        StoredProc last = new StoredProc();
        last.Name = "Last";
        last.IsChecked = false;

        StoredProc another = new StoredProc();
        another.Name = "another";
        another.IsChecked = false;

        StoredProc onemore = new StoredProc();
        onemore.Name = "onemore";
        onemore.IsChecked = false;

        TheList.Add(mea);
        TheList.Add(valic);
        TheList.Add(axa);
        TheList.Add(fidelity);
        TheList.Add(first);
        TheList.Add(second);
        TheList.Add(last);
        TheList.Add(another);
        TheList.Add(onemore);
    }



    public class StoredProc
    {
        public string Name { get; set; }
        public bool IsChecked { get; set; }
    }

    private void UpDownClick(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;
        StoredProc sp = button.DataContext as StoredProc;
        int oldLocation = TheList.IndexOf(sp);

        if (oldLocation > 0 && button.Name == "Up")
        {
            if (oldLocation > 0)
            {
                if (sp.IsChecked || (TheList[oldLocation - 1].IsChecked == sp.IsChecked))
                {
                    TheList.RemoveAt(oldLocation);
                    TheList.Insert(oldLocation - 1, sp);
                }
            }
        }
        if (oldLocation < TheList.Count - 1 && button.Name == "Down")
        {
            if (oldLocation + 1 <= TheList.Count)
            {
                if (sp.IsChecked == false || (TheList[oldLocation + 1].IsChecked == sp.IsChecked))
                {
                    TheList.RemoveAt(oldLocation);
                    TheList.Insert(oldLocation + 1, sp);
                }
            }
        }
    }

    private void Reorder_Click(object sender, RoutedEventArgs e)
    {
        CheckBox checkBox = sender as CheckBox;
        IEnumerable<StoredProc> sort;
        sort = TheList.OrderByDescending(item => item.IsChecked);
        System.Collections.ObjectModel.ObservableCollection<StoredProc> temp = new System.Collections.ObjectModel.ObservableCollection<StoredProc>();

        foreach (var item in sort)
        {
            temp.Add(item);
        }

        TheList.Clear();
        TheList = temp;
    }

    #region FirePropertyChanged

    /// <summary>
    /// Property Changed handler
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
    /// <summary>
    /// Needed to update view model
    /// </summary>
    /// <param name="propertyName"></param>
    protected void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion

0 个答案:

没有答案