【问题标题】:Syntax for adding static resources to an ObjectDataProvider将静态资源添加到 ObjectDataProvider 的语法
【发布时间】:2014-02-04 20:01:45
【问题描述】:

我正在创建几个要添加到 ObjectDataProvider 的静态资源,但我不知道语法。

 <Window.Resources>

    <SolidColorBrush x:Key="SolidFillBrush" Color="Black" Opacity="1.0" />
    <SolidColorBrush x:Key="HalfOpaqueBrush" Color="Black" Opacity="0.5" />
    <SolidColorBrush x:Key="QuarterOpaqueBrush" Color="Black" Opacity="0.25" />
    <SolidColorBrush x:Key="TransparentBrush" Color="Black" Opacity="0" />

    <ObjectDataProvider x:Key="AllFillStyles" ObjectType="{x:Type Brush}" MethodName="???">
         <!-- add the static resources here, but how?  -->
    </ObjectDataProvider>

 </Window.Resources>

有什么建议吗?

编辑:我试图创建一个包含上述画笔的组合框,因此用户可以选择哪个画笔用作网格的填充样式(有点像在 Excel 中,您可以在其中选择填充样式和颜色。 ) 我需要设置 ItemsSource,并找到有人使用 ObjectDataProvider 的地方。我发现你可以在 xaml 中创建一个数组并用画笔填充它,然后改用它。

【问题讨论】:

    标签: wpf staticresource objectdataprovider


    【解决方案1】:

    关于如何使用ObjectDataProvider 的示例。 MethodName 是获取项目时尝试调用的方法的名称

    在您的 xaml 文件中

    <ObjectDataProvider x:Key="objDs"
                                 ObjectType="{x:Type data:CDataAccess}"
                                 MethodName="GetEmployees">
    </ObjectDataProvider>
    

    还有你的类文件

    public class CDataAccess
    {
        ObservableCollection<ImageEmployee> _EmpCollection;
    
        public ObservableCollection<ImageEmployee> EmpCollection
        {
            get { return _EmpCollection; }
            set { _EmpCollection = value; }
        }
    
        public CDataAccess()
        {
            _EmpCollection = new ObservableCollection<ImageEmployee>();
        }
    
        public ObservableCollection<ImageEmployee> GetEmployees()
        {
            SqlConnection conn =
            new SqlConnection("Data Source=.;Initial Catalog=Company;" +
                                "Integrated Security=SSPI");
            SqlCommand cmd = new SqlCommand();
            conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = "Select * from ImageEmployee";
    
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                EmpCollection.Add(
                    new ImageEmployee()
                    {
                        EmpNo = Convert.ToInt32(reader["EmpNo"]),
                        EmpName = reader["EmpName"].ToString(),
                        Salary = Convert.ToInt32(reader["Salary"]),
                        DeptNo = Convert.ToInt32(reader["DeptNo"]),
                        EmpImage = (byte[])reader["EmpImage"]
                    });
            }
            reader.Close();
            conn.Close();
            return EmpCollection;
        }
    }
    

    如果你的MethodName 有参数,你可以把这个添加到你的资源对象提供者中

    <ObjectDataProvider.MethodParameters> 
                     <s:String>Parameter1</s:String> 
    </ObjectDataProvider.MethodParameters>
    

    并确保您的参数类型与其匹配。

    【讨论】:

      【解决方案2】:

      我不知道你对 ObjectDataProvider 的真正目标是什么。

      如果你想在对象 AllFillStyle 上调用一些方法,使用不同的参数来识别资源键(SolidColorBrush 对象)。

      例如:

      • AllFileStyle.GetBrush("SolidFillBrush")
      • AllFileStyle.GetBrush("HalfOpaqueBrush")

      这并不容易,因为need pass paramater dynamically to ObjectDataProvider

      如果您只需要对 SolidColorBrush 的所有资源类型进行分组并在 XAML 中使用。

      您可以在代码中填充 SolidColorBrush 的所有资源类型。

      private ObservableCollection<SolidColorBrush> _windowBrushes;
      
      public ObservableCollection<SolidColorBrush> WindowBrushes
      {
          get
          {
              return _windowBrushes;
          }
      
          set
          {
              _windowBrushes = value;
              OnPropertyChanged("WindowBrushes");
          }
      }
      
      
      private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
      {
          WindowBrushes = new ObservableCollection<SolidColorBrush>();
      
          foreach (var resource in this.Resources.Values)
          {
              SolidColorBrush brush = resource as SolidColorBrush;
      
              if (brush!=null)
              {
                  WindowBrushes.Add(brush);
              }
          }
      }
      

      然后在 XAML 中使用。

      <ListBox x:Name="ListBoxBrushes"
               Grid.Row="0"
               Margin="5"
               ItemsSource="{Binding Path=WindowBrushes, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
          <ListBox.ItemTemplate>
              <DataTemplate>
                  <StackPanel>
                      <Ellipse Width="30"
                               Height="30"
                               Stroke="Black"
                               StrokeThickness="1"
                               Fill="{Binding}" />
                  </StackPanel>
              </DataTemplate>
          </ListBox.ItemTemplate>
      </ListBox>
      
      <Rectangle Grid.Row="1"
                 Margin="5"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch"
                 Fill="{Binding ElementName=ListBoxBrushes, Path=SelectedItem}"/>
      

      您能否使用 ObjectDataProvider 指定您的场景?

      谢谢

      【讨论】:

        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 2013-07-18
        相关资源
        最近更新 更多