使用未定义的数据类型初始化WPF

时间:2019-05-14 17:37:28

标签: c# wpf

这里是带有未定义变量的类,需要将其传递到WPF窗口中。

 public class SelectedVal<T>
{        
    public T val {get;set;}       
}

窗口:

public partial class SOMEDialogue : Window
{
   public List<SelectedVal<T>> returnlist { get { return FullList; } }
   public List<SelectedVal<T>> FullList = new List<SelectedVal<T>>();       

   public SOMEDialogue (List<SelectedVal<T>> inputVal)
    {
       InitializeComponent();
     }

 }

所以这是问题,我该如何正确执行操作以获取T并在WPF中设置全局变量?

已编辑(代码也已编辑):

WPF的目的是:

  • SelectedVal<T>个输入的列表
  • 在此WPF中显示此输入
  • 根据T类型,用户可以对此输入执行某些操作
  • 完成返回List<SelectedVal<T>>的返回列表可以是 已访问

1 个答案:

答案 0 :(得分:2)

这是我正在描述的基本概念。让我知道您是否遇到任何障碍。我猜搜索文本和最小/最大int值是整个对话框的属性。我还假设集合中可能存在多种项目类型,这可能是一个假设。你能澄清一下吗?

选定值类别

public interface ISelectedVal
{
    Object Val { get; set; }
}
public class SelectedVal<T> : ISelectedVal
{
    public T Val { get; set; }

    object ISelectedVal.Val
    {
        get => this.Val;
        set => this.Val = (T)value;
    }
}
public class StringVal : SelectedVal<String>
{
}
public class IntVal : SelectedVal<int>
{
}

对话框视图模型

public class SomeDialogViewModel : ViewModelBase
{
    public SomeDialogViewModel(List<ISelectedVal> values)
    {
        FullList = values;
    }

    public List<ISelectedVal> FullList { get; set; }

    private String _searchText = default(String);
    public String SearchText
    {
        get { return _searchText; }
        set
        {
            if (value != _searchText)
            {
                _searchText = value;
                OnPropertyChanged();
            }
        }
    }

    private int _minInt = default(int);
    public int MinInt
    {
        get { return _minInt; }
        set
        {
            if (value != _minInt)
            {
                _minInt = value;
                OnPropertyChanged();
            }
        }
    }

    private int _maxInt = default(int);
    public int MaxInt
    {
        get { return _maxInt; }
        set
        {
            if (value != _maxInt)
            {
                _maxInt = value;
                OnPropertyChanged();
            }
        }
    }
}

.xaml.cs

public SOMEDialogue (List<ISelectedVal> inputValues)
{
    InitializeComponent();
    DataContext = new SomeDialogViewModel(inputValues);
}

XAML

<Window.Resources>
    <DataTemplate DataType="{x:Type local:StringVal}">
        <StackPanel>
            <Label>Value</Label>
            <Label Content="{Binding Val}" />
            <Label>Search text:</Label>

            <TextBox Text="{Binding DataContext.SearchText, RelativeSource={RelativeSource AncestorType=Window}}" />
            <!-- Other stuff -->
        </StackPanel>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:IntVal}">
        <StackPanel>
            <Label>Value</Label>
            <Label Content="{Binding Val}" />
            <Label>Min value:</Label>
            <TextBox Text="{Binding DataContext.MinIntVal, RelativeSource={RelativeSource AncestorType=Window}}" />
            <Label>Max value:</Label>
            <TextBox Text="{Binding DataContext.MaxIntVal, RelativeSource={RelativeSource AncestorType=Window}}" />
            <!-- Other stuff -->
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ItemsControl
        ItemsSource="{Binding FullList}"
        />
</Grid>