Câu hỏi Binding Enums để DataGrid ComboBox View


Tôi đang làm việc với một ứng dụng WPF, và tôi đang làm việc trên một DataGrid kết hợp việc sử dụng nội dung động phải phản ứng với các sự kiện, v.v.

Tôi có ViewModel sau cho Chế độ xem có chứa DataGrid

public class HiddenFieldPanelViewModel
{
    public List<HiddenFieldComponent> HiddenFieldList { get; set; }
    public HiddenFieldComponent Component { get; set; }
    public bool IsVisible { get; set; }
    public enum FieldTypes{Constant,Variable}
    public HiddenFieldPanelViewModel()
    {
        HiddenFieldList = new List<HiddenFieldComponent>();
        IsVisible = false;
    }
}

Thuộc tính duy nhất trên mô hình này áp dụng cho ví dụ này là thuộc tính enum sau đây

public enum FieldTypes {Constant,Variable}

Những gì tôi cần phải làm khi DataGrid là dân cư là để ràng buộc các loại enum để thả xuống trong tế bào DataGrid, đây là một ví dụ về một trong các mục thu thập DataGrid sau khi nó đã được thêm vào enter image description here

Ví dụ, trong hình trên, tôi muốn nó có cả hai giá trị Enum từ các FieldTypes enum.

Trong XAML của tôi, tôi đã chỉ định như sau:

<DataGridTemplateColumn Header="Field Type" CanUserResize="False">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Height="20" SelectedIndex="0" ItemsSource="{Binding Path=FieldTypes}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Path=Value}"></Label>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Các cột khác đang ràng buộc dữ liệu chính xác, nhưng cột này thì không.

Tôi không chắc chắn nếu có một cách tốt hơn để làm điều đó hay không. Tôi cũng đã viết một EnumConverter từ IValueConverter để xử lý các chuỗi chuyển đổi chuỗi-enum nếu cần thiết.

Cảm ơn


7
2018-03-25 19:15


gốc




Các câu trả lời:


Kéo enum ra khỏi ViewModel của bạn

public enum FieldTypes
{
  Constant,
  Variable,
}

// Don't forget to set up your INotifyPropertyChanged on your properties
// if they are being used for binding
public class HiddenFieldPanelViewModel
{
    public List<HiddenFieldComponent> HiddenFieldList { get; set; }
    public HiddenFieldComponent Component { get; set; }
    public bool IsVisible { get; set; }

    // removed:
    // public enum FieldTypes{Constant,Variable}

    // will likely want to set up a property such as:
    // public enum FieldTypes {get; set;}

    public HiddenFieldPanelViewModel()
    {
        HiddenFieldList = new List<HiddenFieldComponent>();
        IsVisible = false;
    }
}

Đây sẽ là các không gian tên bạn nhập vào xaml của bạn:

xmlns:local="clr-namespace:NamespaceToYourEnum" 
xmlns:System="clr-namespace:System;assembly=mscorlib"

Và sau đó bạn có thể thiết lập ObjectDataProvider để ràng buộc Combobox. Một số mẫu XAML:

<Window.Resources>    
    <ObjectDataProvider x:Key="EnumDataProvider" 
                        MethodName="GetValues" 
                        ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:FieldTypes"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

<!-- FieldTypesEnumProperty would be in your ViewModel -->
<ComboBox Height="25"
        SelectedItem="{Binding Path=FieldTypesEnumProperty}"
        ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" />

10
2018-03-25 19:32



Tuyệt quá! Làm việc như một say mê !!! - TheJediCowboy
Câu hỏi nhanh, có cách nào để đặt mục đã chọn trên combobox theo mục DataGrid đó không? - TheJediCowboy
Xem chỉnh sửa để cập nhật ItemsSource và một SelectedItem. Về cơ bản bạn chỉ cần gắn kết SelectedItem với bất kỳ thứ gì đang được sử dụng để liên kết hàng trong DataGrid của bạn. Thuộc tính sẽ cần phải là OfType FieldTypes. - Metro Smurf


Hãy xem một cái gì đó như:

<DataTemplate>
  <ComboBox SelectedValue="{Binding Path=EstimateStatusValueId}"
            ItemsSource="{Binding Path=DataContext.EstimateStatusValueList, 
              RelativeSource={RelativeSource FindAncestor, 
                AncestorType={x:Type UserControl}}}"
            DisplayMemberPath="Description"
            SelectedValuePath="EstimateStatusValueId" />
</DataTemplate>

1
2018-03-25 19:19



tôi đã thử điều này, và tôi vẫn không thể có được nó để hiển thị các giá trị enum, cảm ơn - TheJediCowboy


Đối với bất cứ ai vẫn đang tìm kiếm câu trả lời:
Trong .net 4.5 bạn chỉ cần tài sản với loại enum của bạn. DataGrid tự động tạo combobox cho bạn.
Một cái gì đó như thế này:

public enum FieldTypes
{
  Constant,
  Variable,
}

public class HiddenFieldPanelViewModel
{
  public FieldTypes Types { get; set; }
}

0
2018-05-14 07:50